当前位置: 首页 > news >正文

MyBatis-缓存与注解式开发

MyBatis的缓存

缓存的作用:通过减少IO的方式,提高程序的执行效率。

mybaits的缓存:将select语句的查询结果放到缓存(内存)中。下一次还是这条select语句的话,直接从缓存中获取,不再查数据库。一方面是减少IO,另一方面不再执行繁琐的查找算法。从而提升效率。

mybatis的缓存包括:

  • 一级缓存:将查询的数据存储到SqlSession中
  • 二级缓存:将查询的数据存储到SqlSessionFactory中
  • 集成第三方缓存:比如EhCache、Memcache

缓存机制只对应select语句

一级缓存

一级缓存默认开启,不需要做任何配置。只要使用同一个SQL session对象执行同一条sql语句,就会走缓存。

@Test
public void testSelectCarById() {SqlSession sqlSession = SqlSessionUtil.openSqlSession();// 执行sql 查询Car car = sqlSession.selectOne("selectCarById", 2);System.out.println(car);// 从缓存中获取,不执行sql查询Car car2 = sqlSession.selectOne("selectCarById", 2);System.out.println(car2);sqlSession.close();
}

那什么时候不走一级缓存?

  1. SQL session对象不是同一个。
  2. 查询条件不一致,执行的不是同一个sql,也不走一级缓存

什么时候一级缓存会失效?

第一次查询和第二次查询之间发生了以下事件中的任何一件,都会让一级缓存失效:

  1. 执行了sqlSession.clearCache();方法。这是手动清空缓存。
  2. 执行了增、删、改的sql语句。不管操作哪张表,都会清空一级缓存。

二级缓存

二级缓存的范围是SqlSessionFactory。

使用二级缓存需要满足以下几个条件:

  1. 在mybatis-config.xml文件中设置<setting name="cacheEnabled" value="true"/>,全局开启或关闭所有映射器配置文件中已配置的任何缓存。默认是true。无需设置。
  2. 在需要使用二级缓存的SqlMapper.xml文件中添加配置:<cache/>
  3. 使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口
  4. SqlSessiond对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可使用。

二级缓存什么时候失效?

只要两次查询之间发生了增、删、改操作。二级缓存就会失效,一级缓存也会失效。

二级缓存的相关配置

eviction:指定从缓存中移除某个对象的淘汰算法。默认采用LRU策略。

  • LRU:Least Recently Used。最近最少使用。优先淘汰在间隔时间内使用频率最低的对象
  • FIFO:First In First Out.一种先进先出的数据缓存器。先进入二级缓存的对象最先被淘汰
  • SOFT:软引用。淘汰软引用指向的对象。具体算法和JVM的垃圾回收算法有关。
  • WEAK:弱引用。淘汰弱引用指向的对象。具体算法和JVM的垃圾回收算法有关。

flushInterval:二级缓存的刷新时间间隔。单位毫秒。如果没有设置。代表不刷新缓存。只要内存足够大,一直会向二级缓存中增加数据,除非执行了增删改。

readOnly:

  1. true:多条相同的sql语句执行之后返回的对象是同一个。性能好。但是duoxc并发可能会存在安全问题。
  2. false:多条相同的sql语句执行之后返回的是对象的副本,调用了clone方法。性能一般,但安全。

size:二级缓存中最多可存储的Java对象数量。默认值是1024.

<cache eviction="" flushInterval="" readOnly="" size=""/>

集成EhCache(第三方缓存)

集成EhCache是为了代替mybatis自带的二级缓存。一级缓存是无法替代的。

第一步引入依赖

第二步编写对应的配置文件

第三步设置XxxMapper.xml 中的type属性

MyBatis的逆向工程

这里的逆向工程指:根据数据库表逆向生成Java的pojo类,SqlMapper.xml文件,以及Mapper接口类等。

第一步,引入依赖、配置插件

 <!-- 配置mybatis-generator插件-->
<!--  定制构建过程,添加mybatis-generator插件,并指定配置文件和依赖项。--><build><!--  可配置多个插件,每个插件都可以有自己的配置和依赖项。--><plugins><!-- mybatis逆向工程插件,自动生成MyBatis相关代码,如Mapper接口、XML映射文件等。--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.1</version><configuration><!--     允许覆盖已存在的文件,--><overwrite>true</overwrite></configuration><!--插件的依赖,指定了MySQL数据库连接器,以便mybatis-generator能够连接到MySQL数据库并生成相应的代码。--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency></dependencies></plugin></plugins></build>

第二步,配置generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!--targetRuntime有2个值:MyBatis3Simple:生成的是基础版,只有基本的增删改查。MyBatis3:生成的是完整版,除了基本的增删改查,还会生成一些复杂查询的方法。--><context id="MyContext" targetRuntime="MyBatis3"><!--防止生成重复代码--><plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/><commentGenerator><!--是否去掉生成的注释中的日期,true表示去掉,false表示不去掉--><property name="suppressDate" value="true"/><!--是否去掉注释,true表示不生成,false表示生成--><property name="suppressAllComments" value="true"/></commentGenerator><!--连接数据库信息--><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/spring6?useSSL=false&amp;serverTimezone=UTC"userId="root"password="root"/><!--生成pojo包名和位置--><javaModelGenerator targetPackage="com.ali.pojo" targetProject="src/main/java"><!-- 是否开启子包,true表示开启,false表示不开启&ndash;&gt;--><property name="enableSubPackages" value="true"/><!-- 是否去除字段名前后的空白,true表示去除,false表示不去除--><property name="trimStrings" value="true"/></javaModelGenerator><!-- 生成sql映射文件的位置和包名--><sqlMapGenerator targetPackage="com.ali.mapper" targetProject="src/main/resources"><!-- 是否开启子包,true表示开启,false表示不开启&ndash;&gt;--><property name="enableSubPackages" value="true"/></sqlMapGenerator><!--生成Mapper接口的位置和包名--><javaClientGenerator type="xmlMapper" targetPackage="com.ali.mapper" targetProject="src/main/java"><!-- 是否开启子包,true表示开启,false表示不开启&ndash;&gt;--><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 表名和对应的实体类名 --><table tableName="t_act" domainObjectName="Act"/></context>
</generatorConfiguration>

第三步:运行逆向工程生成代码文件

无标题

其中生成的XxxExample类是用来封装查询条件的。

使用PageHelper

limit分页

mysql 中limit后面的两个数字:

  1. 第一个数字:startIndex(起始下标。下表从0开始)
  2. 第二个数字:pageSize(每页现实的记录条数)

加入一直页码pageNum和每页显示的记录条数pageSize,就可以获得第一个数字:

startIndex = (pageNum -1)* pageSize

所以分页sql可以写成 (pageNum -1)* pageSize, pageSize

当limit 后面只跟一个数字时,表示默认从下标0开始查询

比如:select * from tabeName limit 2 等价于 select * from tabeName limit 0,2

PageHelper插件

  1. 引入依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.1</version>
</dependency>
  1. 在mybatis-config.xml文件中配置插件

     <plugins><!--mybatis提供了插件机制,可以在执行SQL语句的过程中对SQL语句进行增强,常用的插件有分页插件、性能分析插件等。--><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
    
  2. 编写代码:

      public void testSelectCarByPrice() {SqlSession sqlSession = SqlSessionUtil.openSqlSession();CarMapper carMapper = sqlSession.getMapper(CarMapper.class);// 在查询语句之前调用PageHelper.startPage方法,传入页码和每页显示的记录数PageHelper.startPage(2, 5);List<Car> cars = carMapper.selectList("selectCarByPrice", 20.0);// 第二个参数5表示导航页的数量,导航页是指在分页结果中显示的页码数量,通常用于前端页面的分页导航PageInfo<Car> pageInfo = new PageInfo<>(cars, 5);System.out.println("总记录数:" + pageInfo.getTotal());System.out.println("总页数:" + pageInfo.getPages());for (Car car : cars) {System.out.println(car);}sqlSession.close();}
    

MyBatis注解式开发

注解式开发可以减少sql映射文件得到的配置。但是这种方法会给sql语句的维护带来成本。如果你需要做一些很复杂的操作,最好使用xml来映射语句。

原则:简单sql可以使用注解,复杂sql使用xml。

@Insert注解

注意:以下代码写在XxxMapper的接口文件文件中。

@Insert("insert into clazz values (#{id}, #{name})")
int insertClazz(Clazz clazz);

@Delete注解

@Delete("delete from clazz where id = #{id}")
int deleteClazzById(int id);

@Update注解

@Update("update clazz set name = #{name} where id = #{id}")
int updateClazz(Clazz clazz);

@Select注解

@Select("select * from clazz where id = #{id}")
Clazz selectClazzById(int id);

@Results注解

@Select("select * from clazz where id = #{id}")
// 如果查询结果的列名和属性名不一致,需要使用@Results注解进行映射
@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name")
})
Clazz selectClazzById(int id);
http://www.jsqmd.com/news/457131/

相关文章:

  • COMSOL相场法模拟电介质击穿电树枝:从原理到实践
  • IL-13 Surpass ELISA试剂盒如何揭示其在哮喘等疾病中的核心作用与治疗潜力?
  • 2026支持AI自动化的国产高速PCB设计软件推荐 - 品牌2026
  • 《鬼谷子》总论—殷商后裔鬼谷间谍学院教材
  • 2026隔离门优质厂家推荐榜 - 优质品牌商家
  • showTime
  • ifrme 框
  • 大语言模型“护栏”之争:安全与自由的技术博弈
  • 2026设计仿真一体化与云端多人协同的国产PCB设计软件推荐 - 品牌2026
  • 2026整框无缝焊接系统窗品牌综合测评:五大高适配性品牌推荐及选型指南 - 博客湾
  • 恒温恒湿实验室优质厂家揭秘:不只看品牌,更要看实力与口碑 - 品牌推荐大师1
  • 2026国产高端PCB设计工具推荐:车载与手机主板双场景适用 - 品牌2026
  • 苹果 M5 Pro 和 M5 Max:架构革新下的芯片性能升级
  • OpenClaw火爆背后:全民养虾热下普通人的参与困境
  • 上海劳力士保养价格全解析:2000 元到 6000 元,差在哪? - 时光修表匠
  • 深聊DCMM认证,上海擎标全国服务靠谱吗,性价比咋样? - 工业设备
  • 2026太阳能智慧座椅行业推荐榜:四大优质品牌测评及公共空间选型指南 - 博客湾
  • 钛动科技赴港上市,买量营销何去何从?
  • MySQL 主从延迟排查全流程:不是只看 Seconds_Behind_Master【转】
  • EDA 工具国产替代:2026年行业趋势与自主可控方案讲解 - 品牌2026
  • AI写专著新玩法!利用AI工具,轻松搞定专著选题与框架搭建
  • WPF新手村教程(四)—— Application类
  • 超简单的FFT IP RTL实现:用Cordic搞定蝶形运算
  • 掌握AI专著生成技巧!专业工具助力,轻松完成学术专著创作
  • 2026辊筒干燥机优质推荐榜适配多领域需求:红薯全粉设备、芋头全粉设备、辊筒刮板干燥机、酵母辊筒干燥机选择指南 - 优质品牌商家
  • 掌握AI写专著技巧,借助专业工具轻松打造百万字学术巨著
  • HTML,CSS与JS前端基础课堂笔记
  • Anthropic Agent 工程实战指南:从入门到生产落地 - 广东靓仔
  • 2026国产高端EDA工具推荐:功能、适配与替代方案 - 品牌2026
  • 杭州大厦购物卡回收方法教学与关键提示 - 京回收小程序