MyBatis缓存
一、分 页
1.方式一 :limit 物理分页
// 方式一 limit 物理分页
@Select("select * from student limit #{param1},#{param2}")
public List<Student> findStudentPagelimit(int wz, int bc);
2.方式二:RowBounds 逻辑分页
// 方式二 RowBounds 逻辑分页
@Select("select * from student")
public List<Student> findStudentPageRowBounds(RowBounds rb);
3.方式三:第三方插件 PageHelper
步骤:
3.1 导入jar包
3.2 配置插件
<!-- 思想:面向切面 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
3.3 调用方法
// 方式三 第三方插件 PageHelper@Select("select * from student")public List<Student> findStudentPageHelper();
package com.ztt.test;public class Test {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
// List<Student> slist = stuMapper.findStudentPagelimit((1-1)*3, 3);// RowBounds rb = new RowBounds((2-1)*3,3);
//
// List<Student> slist = stuMapper.findStudentPageRowBounds(rb);Page<Object> startPage = PageHelper.startPage(8, 2);List<Student> slist = stuMapper.findStudentPageHelper();// PageInfo<Student> pageInfo = new PageInfo<Student>(slist);// slist.forEach(System.out::println);// System.out.println(startPage);
// System.out.println(pageInfo);DaoUtil.closeResource(sqlSession);}}
二、延 迟 加 载 和 立 即 加 载
1.什么是立即加载
立即加载是: 不管用不用信息,只要调用,马上发起查询并进行加载
比如: 当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息
通常:当 一对一或者 多对一的时候需要立即加载
2.什么是延迟加载
延迟加载是: 在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫懒加载)
比如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看 班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。
通常: 一对多,或者多对多的是需要使用延迟加载
3.延迟加载的配置
<settings><setting name="lazyLoadingEnabled" value="true"/></settings>
如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据 如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。 aggressiveLazyLoading = true,mybatis 是按层级延时加载 aggressiveLazyLoading = false,mybatis 按需求加载。
三、一级缓存
1.什么是缓存
缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在 缓冲区中,应用程序从缓冲区读取数据。
1.1 特点:
数据库取出的数据保存在内存中,具备快速读取和 使用。
1.2 限制:
读取时无需再从数据库获取,数据可能不是最新的;
2.缓存的术语
针对 缓存数据 | 命中 | 需要的数据在缓存中找到结果。 |
未命中 | 需要的数据在缓存中未找到,重新获取 |
3.什么是 MyBatis 缓存
功能: 减少 Java Application 与数 据库的交互次数,从而提升程 序的运行效率;
方式: 通过配置和定制。
4.缓存的适用性
适合使用缓存: 经常查询并且不经常改变的 数据的正确与否对最终结果影响不大的 比如:一个公司的介绍,新闻等
不适合使用缓存: 经常改变的数据 数据的正确与否对最终结果影响很大 比如商品的库存,股市的牌价等
5.MyBatis 缓存分类
- 一级缓存 会话 session 级别的缓存,针对一 次会话操作内;
- 二级缓存 映射器级别的缓存,针对不同 Namespace 的映射器;
- 自定义缓存 根据各类不同的缓存机制,自定义 缓存的实现方式。
6.一级缓存 SqlSession
SqlSession 默认开启,一级缓存只是相对同一个 SqlSession 对象而言。
Student stu1 = sm.findStudentBysid(1);
student stu2 = sm.findStudentBysid(1);
system.out.println(stu1 == stu2);
输出结果为true
student stu1 = sm.findStudentBysid( 1);sqlSession.close( );sqlSession = DBUtil.getsqlSession( );sm= sqlSession.getMapper( StudentMapper.class) ;
sqlSession.clearCache();|
student stu2 = sm.findStudentBysid(1);
system.out.print1n( stu1 == stu2);
DBUtil.sqlsessionClose(sqlSession) ;
输出结果为false
关闭sqlsession 或者情况sqlsession缓存都可以实现
注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存
7.一级缓存失效情况
不同SqlSession对应不同的一级缓存
同一个SqlSession单查询条件不同
同一个SqlSession两次查询期间执行了任何一次增删改操作
同一个SqlSession两次查询期间手动清空了缓存
四、二级缓存
1.配置步骤:
1.1 在mybatis的mybatis-config.xml中配置
<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>
1.2 在mybatis的sqlmap中配置(mapper.xml中配置)
1.3 在使用的操作中配置(在select标签中配置)
2.二级缓存—注解
配置步骤:
2.1 在mybatis的sqlMapConfig.xml 中配置
2.2 在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了
2.3 二级缓存小结
- Mybatis 的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;
- 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
- 分布式环境下,必然会出现读取到错误 C 数据,所以不推荐使用。
五、自定义缓存
1.自定义缓存分类
- 实现缓存接口 实现 org. apache. ibatis. cache. Cache 接口自定义缓存;
- 引入第三方缓存 引入 Redis 等第三方内存库 作为 MyBatis 缓存。