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的拦截器实现,他帮助我们实现扩展和封装,节省分页扩展的工作量,在实际开发里拿来就可以使用。

相关推荐
代码充电宝16 分钟前
LeetCode 算法题【中等】189. 轮转数组
java·算法·leetcode·职场和发展·数组
我命由我1234519 分钟前
PDFBox - PDDocument 与 byte 数组、PDF 加密
java·服务器·前端·后端·学习·java-ee·pdf
花哥码天下23 分钟前
Oracle下载JDK无需登录
java·开发语言
摇滚侠39 分钟前
Spring Boot 3零基础教程,yml语法细节,笔记16
java·spring boot·笔记
wei8440678721 小时前
本地项目第一次推送到gitee上的完整命令
java·android studio
星球奋斗者1 小时前
计算机方向如何才能更好的找到工作?(成长心得)
java·后端·考研·软件工程·改行学it
Jabes.yang1 小时前
互联网大厂Java面试:缓存技术与监控运维的深度探讨
java·面试指南·缓存技术·监控运维
海梨花1 小时前
【八股笔记】SSM
java·开发语言·笔记·后端·面试·框架
珹洺1 小时前
Java-Spring入门指南(二十五)Android 的历史,认识移动应用和Android 基础知识
android·java·spring
只想码代码1 小时前
什么是程序计数器?
java·jvm