目录
1、分页
(1)分页方式
分页方式1:使用Map集合来保存分页需要数据,来进行分页。
接口代码:
XML代码:
分页方式2:使用RowBounds集合来保存分页需要数据,来进行分页。
接口代码:
测试代码:
分页方式3:使用分页插件来进行分页。
导入jar包:
配置插件:
调用方法:
其中第一个数字就是页数,第二个数字就是步长。
分页插件说明:
测试类代码:
结果输出:
这个相当于把查询的语句变成了一段json格式代码。
pageNum | 当前页的页码 |
pageSize | 每页显示的条数 |
size | 当前页的真实条数 |
total | 总记录页 |
pages | 总页数 |
prePage | 上一页的页码 |
nextPage | 下一页的页码 |
isFirstPage/isLastPage | 是否为第一页/最后一页 |
hasPreviousPage/hasNextPage | 导航分页的页码数 |
navigatepageNums | 导航分页的页码,[1,2,3,4,5] |
2、延迟加载和立即加载
(1)立即加载
立即加载是: 不管用不用信息,只要调用,马上发起查询并进行加载。
比如: 当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息。
通常:当一对一或者多对一的时候需要立即加载。
(2)延迟加载
延迟加载是: 在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫懒加载)。
比如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。
通常:一对多,或者多对多的是需要使用延迟加载。
延迟加载的配置:
- 如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据
- 如果设置 lazyLoadingEnabled = true,默认情况下mybatis是按层级延时加载的。
- aggressiveLazyLoading = true,mybatis是按层级延时加载
- aggressiveLazyLoading = false,mybatis按需求加载。
延迟加载的sqlmap:
select代码的就是XML对应的一对多或多对多的查找映射器的id名称。
3、一级缓存
(1)什么是缓存
缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。
特点:数据库取出的数据保存在内存中,具备快速读取和使用。
限制:读取时无需再从数据库获取,数据可能不是最新的。
(2)缓存的术语
命中:需要的数据在缓存中找到结果。
未命中:需要的数据在缓存中未找到,重新获取。
(3)什么是MyBatis缓存
功能:减少 Java Application 与数据库的交互次数,从而提升程序的运行效率;
方式:通过配置和定制。
(4)缓存的适用性
- 适合使用缓存:经常查询并且不经常改变的,数据的正确与否对最终结果影响不大的,比如:一个公司的介绍,新闻等。
- 不适合用于缓存: 经常改变的数据,数据的正确与否对最终结果影响很大,比如商品的库存,股市的牌价等。
(5)MyBaits缓存分类
一级缓存:会话 session 级别的缓存,针对一次会话操作内;
二级缓存:映射器级别的缓存,针对不同 Namespace 的映射器;
自定义缓存:根据各类不同的缓存机制,自定义缓存的实现方式;
(6)什么是一级缓存
一级缓存是MyBatis的默认缓存,也称为本地缓存。它是基于SqlSession的缓存,即在同一个SqlSession中执行的多次查询会将查询结果缓存在本地内存中。当同一个SqlSession中执行相同的SQL查询时,MyBatis会首先检查一级缓存,如果缓存中已经存在相同的查询结果,就直接返回缓存中的数据,而不会再次向数据库发出查询请求。
一级缓存的作用是提高相同查询的响应速度,减少数据库访问次数。在同一个SqlSession中,如果多次执行相同的查询,只有第一次会访问数据库,后续的查询会直接从一级缓存中获取数据,从而降低了数据库的负担。
sqlSession:默认开启,一级缓存只是相对同一个 SqlSession 对象而言。
测试代码(如果同时直接获取缓存池中的数据,则打印的是true):
测试代码(如果清空缓存池中的数据,则对比两个学生对象的地址则为false):
关闭sqlsession或者情况sqlsession缓存都可以实现第二种测试代码的情况。
注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存。
(7)一级缓存的配置
- localCacheScope:表示配置一级缓存。
- session:默认是 session 级别的缓存。
- statement:statement 级别的缓存。
(8) 一级缓存工作流程
缓存命中的情况下工作流程如下:
缓存未命中的情况下工作流程如下:
(9)一级缓存失效情况
- 不同SqlSession对应不同的一级缓存
- 同一个SqlSession单查询条件不同
- 同一个SqlSession两次查询期间执行了任何一次增删改操作
- 同一个SqlSession两次查询期间手动清空了缓存
4、二级缓存
前言:一级缓存中最大的共享范围就是一个 SqlSession 内部,那么如何让多个 SqlSession 之间也可以共享缓存呢?
(1)什么是二级缓存?
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
二级缓存的作用是在多个SqlSession之间共享缓存数据,从而提高应用程序的性能。它适用于需要缓存共享的数据,如基础数据表(如国家、城市)等,以减少数据库查询的负担。
(2)二级缓存配置步骤
配置步骤:
1、在mybatis的sqlMapConfig.xml中配置
2、在mybatis的sqlmap中配置(mapper.xml中配置)
3、在使用的操作中配置(在select标签中配置)
4、在mapper映射文件中开启二级缓存
<cache eviction="FIFO" flushInterval="60000" size="512"
readOnly="true"/>
5、关于eviction的各个参数属性
- 参数名属性eviction="LRU"最近最少使用的:移除最长时间不被使用的对象。
- (默认)eviction="FIFO"先进先出:按对象进入缓存的顺序来移除它们。
- eviction="SOFT"软引用:移除基于垃圾回收器状态和软引用规则的对象。
- eviction="WEAK"弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
(3)二级缓存(注解)
配置步骤:
1、在mybatis的sqlMapConfig.xml中配置
2、 在接口的定义上面直接使用@CacheNamespace并将blocking设置为true,二级缓存就可以使用了
(4)二级缓存特点
- Mybatis的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;
- 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
- 分布式环境下,必然会出现读取到错误数据,所以不推荐使用。
(5)一级缓存和二级缓存的区别
- 一级缓存的作用域是一个sqlsession内;
- 二级缓存作用域是针对mapper进行缓存;