MyBatis详解(6)
- 分页
- 缓存
- 特点:
- 限制:
- 术语:
- 加载分类
- 立即加载:
- 延迟加载:
- mybatis缓存:
- 缓存的适用性
- MyBatis 缓存分类
- 一级缓存
- 注意:
- 一级缓存未命中
- 二级缓存
- 二级缓存的优劣
- 自定义缓存
分页
方式1:使用limit来分页
方式2:使用Map集合来保存分页需要数据,来进行分页
方式3:使用RowBounds集合来保存分页需要数据,来进行分页
List<Student> list = stuMapper.findStuRowBounds(new RowBounds(2,3));
方式4:使用pageHelper插件
第一步:导包
第二步:引用插件
<!-- 引用插件 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
第三步:在调用前使用PageHelper.startPage(页码,步长)
//startPage(页码,步长)
PageHelper.startPage(2,3);
List<Student> list = stuMapper.findStudentPageHelger();
缓存
缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。
特点:
数据库取出的数据保存在内存中,具备快速读取和使用。
限制:
读取时无需再从数据库获取,数据可能不是最新的;
术语:
命中:需要的数据在缓存中找到结果。
未命中:需要的数据在缓存中未找到,重新获取。
加载分类
立即加载:
不管用不用信息,只要调用,马上发起查询并进行加载
延迟加载:
在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫 懒加载)
<!-- <settings>懒加载/延迟加载<setting name="lazyLoadingEnabled" value="true"/>层级加载<setting name="aggressiveLazyLoading" value="false"/></settings> -->
如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据
如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。
aggressiveLazyLoading = true,mybatis 是按层级延时加载
aggressiveLazyLoading = false,mybatis 按需求加载。
mybatis缓存:
减少 Java Application 与数据库的交互次数,从而提升程序的运行效率;
缓存的适用性
- 适合使用缓存:经常查询并且不经常改变的数据的正确与否对最终结果影响不大的
比如:一个公司的介绍,新闻等
- 不适合用于缓存:经常改变的数据数据的正确与否对最终结果影响很大
比如:商品的库存,股市的牌价等
MyBatis 缓存分类
一级缓存
会话 session 级别的缓存,针对一次会话操作内;
默认开启,一级缓存只是相对同一个 SqlSession 对象而言。
注意:
当调用sqlsession的修改,添加,删除,commit(),close() 等方法是,就会清空一级缓存
<setting name="localCacheScope" value="SESSION"/>
一级缓存未命中
二级缓存
映射器级别的缓存,针对不同Namespace 的映射器;
配置步骤:(xml)
1.在mybatis的sqlMapConfig.xml 中配置
2.在mybatis的sqlmap中配置(mapper.xml中配置)
3.在使用的操作中配置(在select标签中配置)
配置步骤:(注解)
1.在mybatis的sqlMapConfig.xml 中配置
2.在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了
二级缓存的优劣
-
Mybatis 的二级缓存相对于一级缓存来说,实现了缓存数据的共享,可控性也更强;
-
极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
-
分布式环境下,必然会出现读取到错误数据,所以不推荐使用
自定义缓存
根据各类不同的缓存机制,自定义缓存的实现方式。
-
实现 org. apache. ibatis. cache. Cache 接口自定义缓存;
-
引入 Redis 等第三方内存库作为 MyBatis 缓存