mybatis一、二级缓存
时间: 2023-12-04 15:03:01 浏览: 170
MyBatis提供了两种缓存:一级缓存和二级缓存。
一级缓存是指在同一个SqlSession中,执行相同的SQL语句,第一次执行完SQL语句后,会将查询结果缓存到内存中,当再次执行相同的SQL语句时,会直接从内存中获取缓存的结果,而不需要再次查询数据库。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存也会被清空。
二级缓存是指多个SqlSession共享同一个缓存区域,当多个SqlSession执行相同的SQL语句时,会先从缓存中获取结果,如果缓存中没有结果,则再去查询数据库,并将查询结果缓存到缓存区域中。二级缓存的生命周期与MapperFactory相同,当MapperFactory关闭时,二级缓存也会被清空。
下面是一个使用MyBatis一级缓存的例子:
```java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.selectUserById(1);
User user2 = userMapper.selectUserById(1);
System.out.println(user1 == user2); // 输出true,因为两次查询使用了同一个SqlSession,所以第二次查询直接从一级缓存中获取了结果
} finally {
sqlSession.close();
}
```
下面是一个使用MyBatis二级缓存的例子:
1.在MyBatis配置文件中开启二级缓存:
```xml
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.example.User" alias="User"/>
</typeAliases>
<mappers>
<mapper resource="com/example/UserMapper.xml"/>
</mappers>
</configuration>
```
2.在Mapper.xml文件中开启二级缓存:
```xml
<mapper namespace="com.example.UserMapper">
<cache/>
<select id="selectUserById" resultType="User" useCache="true">
select * from user where id = #{id}
</select>
</mapper>
```
3.在Java代码中使用二级缓存:
```java
SqlSession sqlSession1 = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
try {
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = userMapper1.selectUserById(1);
sqlSession1.commit(); // 提交事务,将查询结果写入到二级缓存中
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = userMapper2.selectUserById(1);
System.out.println(user1 == user2); // 输出true,因为两次查询使用了不同的SqlSession,但是都从二级缓存中获取了结果
} finally {
sqlSession1.close();
sqlSession2.close();
}
```
阅读全文