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

相关推荐
Lhappy嘻嘻7 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒7 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚10 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我1234512 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑12 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ13 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案14 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅15 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp15 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47715 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程