资讯动态

MyBatis-缓存与注解式开发

发布时间:2026/8/6 1:41:36 来源:尧图企业网站定制
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(); }那什么时候不走一级缓存SQL session对象不是同一个。查询条件不一致执行的不是同一个sql也不走一级缓存什么时候一级缓存会失效第一次查询和第二次查询之间发生了以下事件中的任何一件都会让一级缓存失效执行了sqlSession.clearCache();方法。这是手动清空缓存。执行了增、删、改的sql语句。不管操作哪张表都会清空一级缓存。二级缓存二级缓存的范围是SqlSessionFactory。使用二级缓存需要满足以下几个条件在mybatis-config.xml文件中设置setting namecacheEnabled valuetrue/全局开启或关闭所有映射器配置文件中已配置的任何缓存。默认是true。无需设置。在需要使用二级缓存的SqlMapper.xml文件中添加配置cache/使用二级缓存的实体类对象必须是可序列化的也就是必须实现java.io.Serializable接口SqlSessiond对象关闭或提交之后一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可使用。二级缓存什么时候失效只要两次查询之间发生了增、删、改操作。二级缓存就会失效一级缓存也会失效。二级缓存的相关配置eviction指定从缓存中移除某个对象的淘汰算法。默认采用LRU策略。LRULeast Recently Used。最近最少使用。优先淘汰在间隔时间内使用频率最低的对象FIFOFirst In First Out.一种先进先出的数据缓存器。先进入二级缓存的对象最先被淘汰SOFT软引用。淘汰软引用指向的对象。具体算法和JVM的垃圾回收算法有关。WEAK弱引用。淘汰弱引用指向的对象。具体算法和JVM的垃圾回收算法有关。flushInterval二级缓存的刷新时间间隔。单位毫秒。如果没有设置。代表不刷新缓存。只要内存足够大一直会向二级缓存中增加数据除非执行了增删改。readOnlytrue多条相同的sql语句执行之后返回的对象是同一个。性能好。但是duoxc并发可能会存在安全问题。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 groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.4.1/version configuration !-- 允许覆盖已存在的文件-- overwritetrue/overwrite /configuration !--插件的依赖指定了MySQL数据库连接器 以便mybatis-generator能够连接到MySQL数据库并生成相应的代码。-- dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.30/version /dependency /dependencies /plugin /plugins /build第二步配置generatorConfig.xml?xml version1.0 encodingUTF-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 idMyContext targetRuntimeMyBatis3 !--防止生成重复代码-- plugin typeorg.mybatis.generator.plugins.UnmergeableXmlMappersPlugin/ commentGenerator !--是否去掉生成的注释中的日期true表示去掉false表示不去掉-- property namesuppressDate valuetrue/ !--是否去掉注释true表示不生成false表示生成-- property namesuppressAllComments valuetrue/ /commentGenerator !--连接数据库信息-- jdbcConnection driverClasscom.mysql.cj.jdbc.Driver connectionURLjdbc:mysql://localhost:3306/spring6?useSSLfalseamp;serverTimezoneUTC userIdroot passwordroot/ !--生成pojo包名和位置-- javaModelGenerator targetPackagecom.ali.pojo targetProjectsrc/main/java !-- 是否开启子包true表示开启false表示不开启ndash;gt;-- property nameenableSubPackages valuetrue/ !-- 是否去除字段名前后的空白true表示去除false表示不去除-- property nametrimStrings valuetrue/ /javaModelGenerator !-- 生成sql映射文件的位置和包名-- sqlMapGenerator targetPackagecom.ali.mapper targetProjectsrc/main/resources !-- 是否开启子包true表示开启false表示不开启ndash;gt;-- property nameenableSubPackages valuetrue/ /sqlMapGenerator !--生成Mapper接口的位置和包名-- javaClientGenerator typexmlMapper targetPackagecom.ali.mapper targetProjectsrc/main/java !-- 是否开启子包true表示开启false表示不开启ndash;gt;-- property nameenableSubPackages valuetrue/ /javaClientGenerator !-- 表名和对应的实体类名 -- table tableNamet_act domainObjectNameAct/ /context /generatorConfiguration第三步运行逆向工程生成代码文件其中生成的XxxExample类是用来封装查询条件的。使用PageHelperlimit分页mysql 中limit后面的两个数字第一个数字startIndex起始下标。下表从0开始第二个数字pageSize每页现实的记录条数加入一直页码pageNum和每页显示的记录条数pageSize就可以获得第一个数字startIndex pageNum -1* pageSize所以分页sql可以写成 pageNum -1* pageSize, pageSize当limit 后面只跟一个数字时表示默认从下标0开始查询比如select * from tabeName limit 2 等价于 select * from tabeName limit 02PageHelper插件引入依赖dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper/artifactId version5.3.1/version /dependency在mybatis-config.xml文件中配置插件plugins !--mybatis提供了插件机制可以在执行SQL语句的过程中对SQL语句进行增强常用的插件有分页插件、性能分析插件等。-- plugin interceptorcom.github.pagehelper.PageInterceptor/plugin /plugins编写代码public void testSelectCarByPrice() { SqlSession sqlSession SqlSessionUtil.openSqlSession(); CarMapper carMapper sqlSession.getMapper(CarMapper.class); // 在查询语句之前调用PageHelper.startPage方法传入页码和每页显示的记录数 PageHelper.startPage(2, 5); ListCar cars carMapper.selectList(selectCarByPrice, 20.0); // 第二个参数5表示导航页的数量导航页是指在分页结果中显示的页码数量通常用于前端页面的分页导航 PageInfoCar 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);

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价