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

相关推荐
qq_12498707535 分钟前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_11 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.12 分钟前
Day06——权限认证-项目集成
java
瑶山14 分钟前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy21 分钟前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_8187320623 分钟前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_9419820537 分钟前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
码字的字节1 小时前
Spring Cloud服务注册与发现(一):手把手搭建Eureka Server,详解高可用配置
spring·spring cloud·eureka
大厂资深架构师1 小时前
Spring Cloud Eureka在后端系统中的服务剔除策略
spring·spring cloud·ai·eureka
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库