关于mybatis的缓存机制(一级缓存和二级缓存)
程序员文章站
2022-06-28 17:06:59
mybatis 缓存通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数mybatis 提供两种缓存机制:一级缓存 和 二级缓存一级缓存mybatis 自带一级缓存无需另外开启,数据存储在Sqlsession中,作用范围在同一个Sqlsession,当使用同一个......
mybatis 缓存
通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数
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);
执行结果
二级缓存
二级缓存默认关闭需要手动开启,作用域范围比一级缓存要大,为Mapper级别,只要是来自同一个Mapper.xml/Mapper接口,无论是否通过同一个SqlSession对象,都可以共用缓存
开启方法:
- 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>
- 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>
- 实体类实现序列化接口
@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"));
执行结果
本文地址:https://blog.csdn.net/L1Ha1Y1/article/details/107883351
上一篇: 利用 Docker 构建一个简单的 java 开发编译环境
下一篇: Byte Buddy 入门教程