关键词:
分三部分记录,MyBatis,MyBatis Spring和Mybatis Generator。
这一片记录MyBatis的一些学习心得。
基本概念
SqlSession
:创建查询使用的是SqlSession
,叫做Session,实际上也是维护了一个数据库的连接,内部通过Connection对象连接数据库。SqlSessionFactory
:用来创建SqlSession
,可以指定一些SqlSession
的属性SqlSessionFacotryBuilder
:用来创建SqlSessionFactory
。而SqlSessionFacotryBuilder
是通过MyBatis的配置文件或配置类创建的
配置
可以通过文件或者类的方法,一个简单的配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 -->
<configuration>
<typeAliases>
<typeAlias alias="User"
type="com.mosakashaka.mybatissample.model.User" />
</typeAliases>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="dev">
<!-- id:唯一标识 -->
<environment id="dev">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/MyMapper.xml" />
</mappers>
</configuration>
有这写信息(不完全列出)
- typeAliases:mapper中使用的类型别名,MyBatis内置java标准类的别名,如果是自定义类,包名比较长,定义别名比较方便
- environments:可以定义多个环境,一般用来指定不同的dataSource配置,其中dataSource也可以指定不同的类型,这里
POOLED
标识会维护一个连接缓存池,避免频繁建立断开连接 - 定义Mappers:mapper是mybatis中的一个基本概念,表示数据库中的表(或者是查询返回的结果),如何map到实体类中。
mappers
一个包含了基本配mapper配置的mapper文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyMapper">
<resultMap id="result" type="User">
<result property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="sex" column="sex" />
<result property="birthday" column="birthday" />
</resultMap>
<select id="getAll" resultMap="result">
SELECT * FROM tb_user;
</select>
<select id="getById" parameterType="int" resultType="User">
SELECT *
FROM tb_user WHERE id = #{id} ;
</select>
<insert id="insertList" useGeneratedKeys="true" keyProperty="id">
insert into tb_user (username, password, name, age, sex, birthday)
values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.name}, #{item.age},
#{item.sex}, #{item.birthday})
</foreach>
</insert>
</mapper>
- mapper文件有
namespace
属性,在这里并没有很大的约束,但是到spring里会比较关键 - mappers定义一系列sql语句段:
select
,insert
,update
,delete
等,在其中写sql语句执行 - sql语句段有id,这也是关进属性,代码中指定要执行哪个sql时,需要靠
namespace.sqlid
来说明执行的语句 - sql中可以通过
#{param}
的方式注入调用传入的参数 - sql支持条件化拼接:
if
,when
,foreach
等。 - 强大的
resultMap
功能,可以将查询结果map到复杂的实体类
resultMap
通过语句中的resultMap=xxx
标签,指定语句返回结果被一个resultMap
解析关联到实体类。
一个复杂的查询selectBlogDetails
通过id为detailedBlogResultMap
的ResultMap关联到Blog
实体类:
<!-- Very Complex Statement -->
<select id="selectBlogDetails" resultMap="detailedBlogResultMap">
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A.password as author_password,
A.email as author_email,
A.bio as author_bio,
A.favourite_section as author_favourite_section,
P.id as post_id,
P.blog_id as post_blog_id,
P.author_id as post_author_id,
P.created_on as post_created_on,
P.section as post_section,
P.subject as post_subject,
P.draft as draft,
P.body as post_body,
C.id as comment_id,
C.post_id as comment_post_id,
C.name as comment_name,
C.comment as comment_text,
T.id as tag_id,
T.name as tag_name
from Blog B
left outer join Author A on B.author_id = A.id
left outer join Post P on B.id = P.blog_id
left outer join Comment C on P.id = C.post_id
left outer join Post_Tag PT on PT.post_id = P.id
left outer join Tag T on PT.tag_id = T.id
where B.id = #{id}
</select>
<!-- Very Complex Result Map -->
<resultMap id="detailedBlogResultMap" type="Blog">
<constructor>
<idArg column="blog_id" javaType="int"/>
</constructor>
<result property="title" column="blog_title"/>
<association property="author" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
<result property="email" column="author_email"/>
<result property="bio" column="author_bio"/>
<result property="favouriteSection" column="author_favourite_section"/>
</association>
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
<association property="author" javaType="Author"/>
<collection property="comments" ofType="Comment">
<id property="id" column="comment_id"/>
</collection>
<collection property="tags" ofType="Tag" >
<id property="id" column="tag_id"/>
</collection>
<discriminator javaType="int" column="draft">
<case value="1" resultType="DraftPost"/>
</discriminator>
</collection>
</resultMap>
- association:一对一的查询,通过id属性匹配
- collection:一对多的匹配,通过id属性匹配
- discriminator:根据某一列不同的值,指定
resultMap
使用其他形式。这个例子里不是那么有用,因为这个属性会覆盖所有跟属性。
使用
创建连接
// 指定全局配置文件
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sqlSession
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
//执行一些CRUD操作
}
这里用配置文件创建了SqlSessionFactoryBuilder
,进而创建SqlSessionFactory
->sqlSession
。
在sqlSession
执行一些数据库操作
使用
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
System.out.println("sessecion:" + sqlSession.toString());
// 操作CRUD,第一个参数:指定statement,规则:命名空间+“.”+statementId
// bulk insert
User u1 = new User();
u1.setName("测试1");
u1.setUsername("test1");
u1.setPassword("123456");
u1.setSex(0);
u1.setAge(30);
u1.setBirthday(new Date(-1, 2, 10));
User u2 = new User();
u2.setName("测试2");
u2.setUsername("test2");
u2.setPassword("123456");
u2.setSex(0);
u2.setAge(320);
u2.setBirthday(new Date(1, 3, 10));
sqlSession.insert("MyMapper.insertList", new ArrayList<User>() {
{
add(u1);
add(u2);
}
});
sqlSession.commit();
User user = sqlSession.selectOne("MyMapper.getById", 1);
List<User> users = sqlSession.<User>selectList("MyMapper.getAll");
System.out.println(user);
for (User u : users) {
System.out.println(u);
}
}
通过SqlSession
的selectList
,selectOne
,delete
,insert
等方法,调用xml中配置的sql(传入namespace.sqlId)调用,参数是sql中指定的参数。
mybatis学习记录5mybatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类.现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情首先二级缓存默认是不开启的,需要自己配置开启.如上图,需要在configuration里去... 查看详情
mybatis学习记录------4
一mybatis开发dao的方法1SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次Sq... 查看详情
mybatis学习记录------3
一删除用户1映射文件<!--删除用户根据ID删除用户--><deleteid="deleteUser"parameterType="java.lang.Integer">deletefromuserwhereid=#{id}</delete>2测试@TestpublicvoiddeleteUserTest()throwsIOException{//Mybatis 查看详情
mybatis学习过程记录(代码片段)
一、Mybatis1、mybatis-config.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/myba 查看详情
mybatis学习记录------2
一 单条记录查询上篇博客的例子便是单条记录查询二多条记录查询1在映射文件中加入如下sql查询,${}:表示拼接sql串,将接收到的参数不加任何修饰拼接在sql中,${value}:接收输入参数的内容,如果传入类型是简单类型,$... 查看详情
mybatis学习记录3mappermethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMethod.execute(sqlSession,args);所以想再简单学习记录下MapperMethod类 组成从... 查看详情
mybatis源码学习记录
1、mybatis源码分析相关文章(1)https://www.cnblogs.com/zhjh256/p/8512392.html2、mybatis设计模式相关文章(1)http://www.crazyant.net/2022.html?hmsr=toutiao.io&utm_medium=toutiao.io&am 查看详情
mybatis结果映射与mybatis缓存初探学习记录(代码片段)
MyBatis高级结果映射(一对一、一对多、多对多的映射),延迟加载,查询缓存(一级缓存),二级缓存的学习记录;1、学习中所使用到的例子,数据库基础分析2、高级结果映射3、延迟加载4、... 查看详情
mybatis原理分析学习记录(代码片段)
以下个人学习笔记,仅供参考,欢迎指正。MyBatis是支持定制化SQL、存储过程以及高级映射的持久层框架,其主要就完成2件事情:封装JDBC操作利用反射打通Java类与SQL语句之间的相互转换MyBatis的主要设计目的就是让我们对执行SQL... 查看详情
mybatis学习记录6typehandler
主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景如上图所示,观察下接口方法就能明白.TypeHandler主要用于JDBC数据与Java对象数据之间转化,比如更新数据库的时候可以... 查看详情
mybatis学习记录------1
一认识mybatismybatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(对象,关系映射)实现。其封装性要低于Hibernate,性能优越,并且小巧、简单易学,应用也越来越广泛。二搭建mybatis... 查看详情
mybatis学习过程记录(代码片段)
一、Mybatis1、mybatis-config.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--外部引入db--><propertiesresourc... 查看详情
employeemapper.xml例子,学习佟刚老师的mybatis课程,记录下的employeemapper.xml,注释详细
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.atguigu.mybatis.dao.Employ 查看详情
mybatis学习笔记一
昨天看了一下mybatis,学习了一下有很多东西还不懂,但是想把一些知道的记录一下,如有错误请大家多多指点。 mybatis它是apche的一个开源项目,它以前的没名字并不是叫mybatis而是叫ibatis,2010年这个项目由apachesoftwarefound... 查看详情
mybatis学习
什么是MyBatis?MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJ... 查看详情
mybatis入门学习
一、MyBatis入门简要介绍(百科) MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接... 查看详情
我的日常报错学习记录
...先继续写下去,结果到了mapper层,无法导出@mapper的包,mybatis.xml也报错,开始排查错误,发现是mybatis版本过高。将2.0.0改成1.3.2即可,报错消失,@mapper可以导出包。但是我的mybatis.xml还在报错啊~~~~~继续改错去~~~~ 查看详情
mybatis学习
前言感觉学习进度还是比较慢啊,一整天的学习效率不是很高,一会看电视,一会喝茶,对自己的要求不严格...今天就说说关联表数据的插入以及别名的使用。正文1.关联插入 之前,我在数据库中已经创建了一张users表,现... 查看详情