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

相关推荐
土狗TuGou10 分钟前
SQL进阶笔记 · 第1篇:存储引擎
java·数据库·笔记·后端·sql·mysql
雨落在了我的手上16 分钟前
Java数据结构(一):初识集合框架
java·开发语言
码语智行18 分钟前
Spring Security自定义AuthenticationManager实现手机号/密码双认证
java·后端·spring
SuniaWang18 分钟前
《AgentX 专栏》07-全链路可观测:用OpenTelemetry+Jaeger让每次AI对话都可追踪可复盘
java·人工智能·spring·架构·langchain·opentelemetry·agenx
fengxin_rou19 分钟前
【从零开始的JUC并发第五章】:线程池详解
java·jvm·spring
咖啡八杯23 分钟前
GoF设计模式——装饰模式
java·算法·设计模式·装饰器模式
_Aaron___24 分钟前
RAG 知识库越用越脏?先把“增量更新”设计清楚
java·人工智能
飞翔中文网26 分钟前
Java学习笔记之注解
java·笔记·学习
BossFriday28 分钟前
【手撸IM】SycllaDB 消息存储基础
java·分布式·中间件
霸道流氓气质29 分钟前
导入历史跟踪机制实战指南
java·linux·服务器