重新认识Mybatis框架
定义与认识
三句话:
MyBatis是一流的持久性框架,支持自定义SQL,存储过程和高级映射。
MyBatis消除了几乎所有的JDBC代码以及参数和检索的手动设置。
MyBatis可以使用简单的XML或注释进行配置,并将图元,映射接口和Java POJO(普通的旧Java对象)映射到数据库记录。
![](https://img.haomeiwen.com/i4017523/5499f4964e7551b6.png)
方式
- 编程式 使用自带api,进行操作。
2.集成式,manager集成spring进行数据库操作。
两种配置方式
1.xml配置
2.注解式
工作中如何使用
1.分析业务
2.定义表结构
3.generator 生成我们需要的类。
generator : 就是一个可以自动扫描数据库中对应的表,生成对应的Vo对象和mapper对象的技术。
使用:
- pom.xml 配置generator插件.
- 配置 generatorConfig.xml
- 执行 mvn mybatis-generator:generate
- 生成Bean和Example
每个sqlSession的四个scope,区别:
![](https://img.haomeiwen.com/i4017523/e10198be58e658c4.png)
Mapper使用的两种方式:
xml和annotation形式
- 兼容? 兼容形式 互补,可以同时存在,不能有相同mapper的id
-
Pros vs cons
Config文件部分解读 http://www.mybatis.org/mybatis-3/configuration.html
-
Environment
-
TypeHandler (java和表字段类型的转换实现)
c) 注册到使用字段上
a) 定义com.gupao.dal.typehandlers.TestTypeHandle
b) 注册com.gupao.dal.config.MybatisConfig#localSessionFactoryBean
-
Plugins
拦截范围
a) 定义 com.dal.plugins.TestPlugin
b) 注册 com.dal.config.MybatisConfig#localSessionFactoryBean
c) 使用。
关于配置文件 解读。
mapper文件解读
-
namespace
关联到接口方法,区分类似package的作用 -
resultMap/resultType
-
sql
-
select insert update delete 增删改查的sql语句
-
使用动态SQL,就是sql语句包含逻辑判断。
http://www.mybatis.org/mybatis-3/dynamic-sql.html -
关于缓存,可以设置,第二次查询,若无其他非查询操作,走缓存,不会去查数据库。一级二级指的是scope级别
a) 一级缓存(sqlSession)
基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。
一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存)
第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。
![](https://img.haomeiwen.com/i4017523/8f12ea0268b778ad.png)
如何验证,先执行查询一条sql,发现有日志打印,在执行第二次同样的sql,发现这时候没有打印sql,因为mybatis根据第一条sql,把该sql存入缓存了,这时候不会再编译执行sql去数据库取数据,自然没有打印。
b) 二级缓存(mapper级别)
使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的
二级缓存的作用域是mapper的同一个namespace。不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。
在**Mapper.xml中开启当前mapper的namespace下的二级缓存
代表创建了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的。
evicition收回策略,默认是LRU
回收策略如下:
(1)LRU最近最少使用策略,一处做长时间不被使用的对象。
(2)FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
(3)SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
(4)WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象
如何进行分页的方式
a) 逻辑分页
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValuesForSimpleResultMap 内存里分页
b) 物理分页
i. select … limit 0,10;
ii. 分页插件 https://github.com/pagehelper/Mybatis-PageHelper
批量操作
![](https://img.haomeiwen.com/i4017523/735298d32e38caa6.png)
整体架构图:
![](https://img.haomeiwen.com/i4017523/2b34b4dfc4027159.png)