一个解决数据的持久化问题的框架.
Mybatis框架的快速入门
- 创建数据库
- 创建Maven工程,在pom.xml文件中添加mybatis坐标.
1 | <dependencies> |
- 编写user类,注意:user类中的变量与数据库中的列名保持一致
- 编写持久层接口UserDao
- 编写UserDao接口的映射文件Mapper.xml
- 编写配置文件MapConfig.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
- 编写测试类,测试.
在使用Mybatis时
- //1.读取配置文件
- //2.创建SqlSessionFactory的构建者对象
- //3.使用构建者创建工厂对象SqlSessionFactory
- //4.使用SqlSessionFactory生产SqlSession对象
- //5.使用SqlSession创建dao接口的代理对象
- //6.使用代理对象执行查询所有方法
- //7.释放资源
代码如下
1 | //1.读取配置文件 |
Mybatis实现CURD操作
- 在接口中定义方法
- 在mapper.xml文件中使用标签将方法与sql语句的映射关系建立起来.
在标签中,id是方法名称,parameterType是传入参数类别,在返回参数中,当类的名称与数据库列名一一相对的时候,resultType就是返回数据类型,否则,使用resultMap来将类中的变量与数据库中的列名对应,再使用resultMap来设定返回类型.
1 | <select id="findAll" resultType="doMain.user"> |
- 测试类中测试方法.
保存操作中的获取返回的自动增长key
在保存操作中,某些键会被设置自动增长,插入成功后,若要正确返回自增的id值,只需要在mapper配置selectKey标签即可
1 | <insert id="saveUser" parameterType="doMain.user"> |
其中, keyProperty是类中id名 keyColumn 是数据库中的列名 resultType 是返回类型 order是使用世纪,after表示操作之后再执行.
CURD的sql语句的preparedStatement语句写法
在需要使用preparedStatement语句时,mapper.xml中特殊的办法是:
多变量,如保存一个用户的数据
修改一个数据
1 | <insert id="saveUser" parameterType="doMain.user"> |
单变量
1 | <delete id="deleteUser" parameterType="int"> |
关于#{}:
在Mybatis的mapper.xml文件中,当parameterType是一个具体类时,#{}中的要填写正确的类中的变量名,但如果,parameterType传入的具体的基本变量类型时,#{}就相当于平时jdbc中的占位符?,可以随意填写.
关于properties和typeAlias标签的使用
properties标签用于引入外部文件或提前定义信息
如:在mapperConfig.xml文件中我们可以引入外部的jdbc文件来动态获取mysql的配置.
1 | <configuration> |
typeAlias标签用于起别名
标签使用,type属性为被定义的类,alias属性为起的别名,当配置完成后,别名也能当作全限定类名来使用.
1 | <typeAliases> |
Mybatis中的模糊查询
1 | <select id="findUserByName" parameterType="string" resultType="doMain.user"> |
这样填写时,传入的参数要在两边拼接上%号查询.
模糊查询的另一种配置方式
1 | <select id="findByName" parameterType="string" resultType="com.itheima.domain.User"> |
此时,传入的数据不需要拼接就可以正常查询出来了.
#{}与${}的区别
1 | #{}表示一个占位符号 |
实现类中变量名与数据库列名不对应时的解决办法(resultMap)
当实现类中的变量名与数据库的列名不是对应时,可以使用两种方法
- 起别名,即使用as,但该方法繁琐.
- 使用resultMap,建立一个变量名与数据库列名的映射
此时若有变量id,name,sex,birthday,但数据库列名分别位:Uid,Uname,Usex,Ubirthday,在mapper.xml配置文件中添加以下信息.
1 | <resultMap type="doMain.user" id="userMap"> |
此时,数据库列名与变量名的映射就建立了起来.type属性表明该resultMap中的变量为doMain.user类中的,id属性为起的一个名称,在调用时,使用该id.标签内,id属性表示主键,其余result属性表示其他变量与列的映射关系.
Mybatis中的连接池
连接池分类
连接池分两类,为unpooled与pooled
1.unpooled连接池原理
JDBC修改自动提交事务
仅需要在创建Session对象时传入参数true即可
Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制,openSession方法有很多的重载方法.使用的该方法调用JDBC的setAutoCommit(),传入true,就开启了自动提交事务.
Mybatis的动态SQL语句
在mapper.xml配置文件中的select标签下可以添加if,where标签.
- if标签:必要属性 test
if标签用来判断一些传入参数,当参数满足条件,作为条件进行查询.
1 | <select id="findByUser" resultType="user" parameterType="user"> |
此处的1=1仅仅是一个占位符,在下面的if语句满足后进行替换.
- where标签,用来替换sql语句中的where与占位符
1 | <select id="moveFind" resultType="doMain.user" parameterType="doMain.user"> |
- foreach标签
对一个集合中的元素循环取出,然后查询.
在这里新建了一个queryVO类,类中有一个私有的List集合,向集合中添加元素,然后在以下代码中取出,查询.
1 | <select id="findList" parameterType="doMain.queryVO" resultType="doMain.user"> |
取出就是这样(1,2,3,4) 用逗号将每一个集合中的元素分开.
Mybatis的多表查询
一对多 多表查询
Mybatis延迟加载
Mybatis缓存
一级缓存
只要sqlSession存在,即没有被close或flush时,一级缓存就存在,当第一次进行查询操作时,查询的结果就被存入了Mybatis的一级缓存,下一次查询时,会先在一级缓存中寻找,如果有就直接取出,没有就重新查询.当进行增加,删除,修改的操作并提交事务后,一级缓存就会被清空.
==sqlSession.clearCache()也可以清空缓存.==
二级缓存
多个sqlSession跨Session共同操作一片缓存区域.
二级缓存使用步骤:
- 二级缓存的开启/关闭
在mapperConfig.xml中加入
1 | <settings> |
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为false 代表不开启二级缓存。
- 在mapper映射文件中使用
标签配置 - 在需要使用二级缓存的方法上对userCache属性定位true
1 | <select id="findAll" resultMap="AccountUserMap" useCache="true"> |
==针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存==
Mybatis注解开发
mapperConfig.xml配置中,在
1 | <?xml version="1.0" encoding="UTF-8"?> |
此时,不需要再使用mapper.xml来配置.
CURD操作
在接口中,方法名上使用注解(Select,Update,Insert,Delete)来配置
1 | @Select("select * from user") |
注解操作多表查询
注解解决类名与数据库表名不一致的问题
使用注解@Results
1 | @Results(id = "map",value = { |
注解Results中,id为给对应关系的Results起一个名字,value中配置各属性对应的数据库表列名.Vlaue中,注解Result中的id为是否为主键,是则配置true,默认为false.
配置完毕后,在之后的方法注解中,就可以直接引用.
注解完成多表一对一查询
1 | @Select("select * from account") |
此处,使用@Result注解,子注解Result可以配置多表查询,property代表本类中的变量名,column代表查询时的标记(数据库)
one=@One中,select代表查询方法(此处需要全限定类名),detchType代表延迟加载类型(EAGER为立即加载,LAZY为延迟加载).
注解方式完成多表一对多查询
主体查询方法:
1 | @Select("select * from user") |
一对多查询方法:
1 | @Select("select * from account where uid=#{id}") |
延迟加载与立即加载的区别:
注解使用二级缓存
- 在mapperConfig.xml文件中配置
1 | <settings> |
- 在接口上使用注解@CacheNamespace
将其属性blocking设置为true,默认为false,此时就打开了二级缓存.