1、查询缓存
Mybatis提供一级缓存和二级缓存。
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象。在该对象中有一个数据结构(HashMap)用户存储缓存数据。
不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
二级缓存是mapper级别的缓存,多个sqlSession去操作同一个mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存是跨sqlSession的。
1.1、一级缓存
1.1.1、一级缓存工作原理
1.1.2、一级缓存测试
测试代码:(使用同一个sqlSession进行查询)
@Test
public void testFirstCache(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.findUserById(1);
User user1 = userDao.findUserById(1);
System.out.println(user);
System.out.println(user1);
} 测试结果:(查询结果相同,而且只生成一条sql语句,证明一级缓存存在)
1.2、二级缓存
1.2.1、二级缓存原理:
1.2.2、开启二级缓存
<?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>
<!-- 开启二级缓存 -->
<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="lsq.study.dao.UserDao">
<!-- 开启本mapper的namespace下的二级缓存 -->
<cache/>
<select id="findUserById" parameterType="int" resultType="lsq.study.domain.User">
select * from user where id = #{id}
</select>
</mapper>
1.2.3、测试代码
@Test
public void testSecondCache(){
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserDao userDao1 = sqlSession1.getMapper(UserDao.class);
User user1 = userDao1.findUserById(1);
sqlSession1.commit();
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
User user2 = userDao2.findUserById(1);
System.out.println(user1);
System.out.println(user2);
} 测试结果:1.2.4、useCache配置
1.2.5、刷新缓存
1736



被折叠的 条评论
为什么被折叠?



