mybatis框架——缓存,分页

目录

缓存机制

[#,区别](#,区别)

如何进行分页


缓存机制

设计2级缓存提升检索效率,避免每次查询的时候都需要访问数据库。

一级缓存,SQLsession级别缓存,本地缓存。因为每个用户在执行查询的时候都使用SQLSession来执行,为了避免每次都去查询数据库,mybatis把查询出来的数据保存到SQLSession的本地缓存里,如果SQL命中缓存,就可以直接从缓存里读取。

如果想要实现跨SQLSession级别的缓存,1级缓存就无法实现了,使用2级缓存。当多个用户在查询的时候,只要有任何一个用户拿到数据,就会放入2级缓存,齐全SQLSession可以从2级缓存里读取数据。

实现原理,1级缓存,在SQLSession里有一个Executor对象,每个Executor对象有一个Localcache对象。当用户发起查询时候,根据执行语句在Localcache里查询,没有命中,在查询数据库并写入Localcache,否则直接返回。1级缓存的生命周期只在SQLSession级别,而且在多个SQLSession或者分布式环境下,可能导致数据库写操作出现脏数据。

2级缓存,使用cachingExecutor对象,对executor进行封装,进入1级缓存的查询流程之前,会通过cachingExecutor进行2级缓存查询。开启2级缓存之后会被多个SQLsession共享,2级缓存是一个全局缓存。所以查询流程是先2级缓存,在1级缓存,最后查询数据库。2级缓存实现了SQLsession之间的数据共享,缓存粒度控制到namespace级别。

#,$区别

占位符,他们是实现动态SQL的方法,通过这2种方法把参数传递到xml后,mybatis,会对这2种占位符进行解析。

#,等同于jdbc里面的?占位符,相当于在preparedStatement预处理语句里设置参数,而preparedStatement里的SQL语句是预编译的,如果在设置的参数里包含特殊字符,会进行转义,他可以防止SQL注入。

$,相当于把参数直接拼接到SQL里面,不会对他进行特殊处理。动态参数,适用于动态SQL场景,动态传递表名,设置排序字段。

如何进行分页

逻辑分页,先查询出所有数据在缓存到内存,在根据业务相关需求,从内存里筛选出适当数据进行分页。

物理分页,使用数据库支持分页语法来实现,例如,分页关键词limit。

mybatis的4种分页方式

1.在mybatis mapper 配置文件里直接写分页SQL语句,这种方式灵活简单。

2.rowBounds 实现逻辑分页,一次性加载所有符合查询条件的数据,根据分页参数值在内存里实现分页,不适合数据量大的场景。

3.拦截器实现,通过拦截需要分页的SQL语句,并在这个SQL语句里动态拼接分页关键词,实现分页。

4.插件pageHelper,使用mybatis的拦截器实现,他帮助我们实现扩展和封装,节省分页扩展的工作量,在实际开发里拿来就可以使用。

相关推荐
黑胡子大叔的小屋38 分钟前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark41 分钟前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
雷神乐乐2 小时前
Spring学习(一)——Sping-XML
java·学习·spring
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
V+zmm101342 小时前
基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
文大。2 小时前
2024年广西职工职业技能大赛-Spring
java·spring·网络安全
一只小小翠3 小时前
EasyExcel 模板+公式填充
java·easyexcel
m0_748256343 小时前
QWebChannel实现与JS的交互
java·javascript·交互
Jelena技术达人4 小时前
Java爬虫获取1688关键字 item_search接口返回值详细解析
java·开发语言·爬虫
u0107735144 小时前
【字符串】-Lc5-最长回文子串(中心扩展法)
java·算法