Mybatis缓存(一)
1、什么是缓存
Mybatis提供缓存,用于减轻数据压力,提高数据库性能。
2、Mybatis缓存分类
Mybatis的缓存分为一级缓存和二级缓存。
Mybatis的一级缓存
1、一级缓存的范围
1. 一级缓存是SqlSession级别的缓存。
2. 在操作数据库时需要构造SqlSession,在SqlSession中有一个HashMap结构的数据结构,用来存储一级缓存。
3. 一级缓存是SqlSession级别的缓存,因此不同的SqlSession对象之间的缓存是互不影响的,每个SqlSession对象都有自己的缓存。
4. Mybatis的一级缓存是默认开启的。
2、工作原理
说明:
1. 当一次执行查询的时候,首先会去查询一级缓存,如果一级缓存中没有数据,然后才回去查询数据库,数据库返回后会将返回的数据保存到一级缓存之中。
2. 第二次再去查询相同的数据时,就会直接从一级缓存中取数据,不再需要去查询数据库。
3. 如果在两次查询之间执行了SqlSession的commit操作(执行插入、更新、删除),则会清空一级缓存,这样是为了防止读到脏数据。
3、一级缓存的测试
1. mapper.xml文件
<select id="findUser" parameterType="int" resultType="User">
SELECT * FROM User WHERE id = #{value}
</select>
<select id="updateUser" parameterType="User" >
UPDATE User SET username=#{username} WHERE id = #{id}
</select>
2. mapper接口文件
public User findUser(int id) throws Exception;
public User updateUser(User user) throws Exception;
3. 测试代码
public void testFi() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
//第一次查询,会发送SQL语句,去数据库查询
User user = mapper.findUser(1);
System.out.println(user);
//执行修改的commit操作
user.setUsername("小明");
mapper.updateUser(user);
session.commit();
//第二次查询,如果没有执行commit操作,直接在缓存中取数据,不会发生sql语句查询数据库
//如果执行了commit操作,会发生sql语句查询数据库
User user1 = mapper.findUser(1);
System.out.println(user1);
}
4、一级缓存的应用
1. 在实际开发中,是将Mybatis和Spring进行整合开发,事务的控制放在service中。
2. 一个service中会存在很多的方法去调用mapper方法。
3. 如果执行两次service去调用同一个mapper方法,不会走一级缓存,因为第一次调用结束会清空一级缓存。
4. 一个SqlSession方法结束时,会关闭SqlSession对象,关闭时会清空一级缓存。