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对象,关闭时会清空一级缓存。

posted @ 2017-07-30 22:11  一条路上的咸鱼  阅读(307)  评论(0编辑  收藏  举报