欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于mybatis的缓存机制(一级缓存和二级缓存)

程序员文章站 2022-06-28 17:06:59
mybatis 缓存通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数mybatis 提供两种缓存机制:一级缓存 和 二级缓存一级缓存mybatis 自带一级缓存无需另外开启,数据存储在Sqlsession中,作用范围在同一个Sqlsession,当使用同一个......

mybatis 缓存

通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数

mybatis 提供两种缓存机制:一级缓存 和 二级缓存

关于mybatis的缓存机制(一级缓存和二级缓存)

一级缓存

mybatis 自带一级缓存无需另外开启(无法关闭),数据存储在Sqlsession中,作用范围在同一个Sqlsessi,当使用Sqlsession对象第一次执行sql语句时,数据会自动存入Sqlsession对象,第二次使用直接从Sqlsession对象中获取

Java代码

InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream); SqlSession sqlSession = build.openSession(); BorrowsMapper mapper = sqlSession.getMapper(BorrowsMapper.class); Borrows borrows1 = mapper.findById("1100011"); Borrows borrows2 = mapper.findById("1100011"); System.out.println(borrows1); System.out.println(borrows2); 

执行结果

关于mybatis的缓存机制(一级缓存和二级缓存)

二级缓存

二级缓存默认关闭需要手动开启,作用域范围比一级缓存要大,为Mapper级别,只要是来自同一个Mapper.xml/Mapper接口,无论是否通过同一个SqlSession对象,都可以共用缓存

开启方法:

  1. mybatis-config.xml(全局配置文件) 中开启二级缓存
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--配置数据源--> <configuration> <settings> <!--打印sql--> <setting name="logImpl" value="STDOUT_LOGGING" /> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"/> </settings> 
  1. Mapper.xml(对应接口的映射文件) 中配置二级缓存
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.eleven.mapper.CardMapper"> <select id="findById" parameterType="java.lang.String" resultType="Card"> select * from Card where CNO = #{CNO} </select> <cache></cache> </mapper> 
  1. 实体类实现序列化接口
@Data @AllArgsConstructor @NoArgsConstructor public class Card implements Serializable { private String CNO; private String NAME; private String CLASS; } 

Java代码

 InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream); //创建两个SqlSession对象 SqlSession sqlSession1 = build.openSession(); SqlSession sqlSession2 = build.openSession(); CardMapper mapper1 = sqlSession1.getMapper(CardMapper.class); CardMapper mapper2 = sqlSession2.getMapper(CardMapper.class); //分别用不同的对象执行两次相同sql语句 System.out.println(mapper1.findById("sx001")); //只有一级缓存失效,才会启动二级缓存 若没关闭则两个对象分别执行各自的sql语句 sqlSession1.close(); System.out.println(mapper2.findById("sx001")); 

执行结果

关于mybatis的缓存机制(一级缓存和二级缓存)

本文地址:https://blog.csdn.net/L1Ha1Y1/article/details/107883351