Mybatis 的一级缓存

1.创建 Mapper

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE name = #{name} limit 1")
    User selectOne(@Param("name") String name);

    @Select("SELECT * FROM user WHERE age = #{age}")
    List<User> selectList(@Param("age") Integer age);

    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);
}

测试数据

userMapper.insert("贝贝", 23);
userMapper.insert("琪琪", 23);
userMapper.insert("二狗", 23);

 

示例1:

userMapper.selectOne("贝贝");
userMapper.selectOne("贝贝");
userMapper.selectList(23);

总共发出了 3条请求,并且每个请求都会创建一个新的 sqlSession

 

示例2:

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    UserMapper userMapper2 = sqlSession.getMapper(UserMapper.class);
    userMapper2.selectOne("贝贝");
    userMapper2.selectOne("贝贝");
    userMapper2.selectList(23);
    sqlSession.commit();
}

公用一个 sqlSession,只发了 2条请求,其中第2个语句没有发请求(利用了 mybatis 一级缓存)

 

 示例3:

@Transactional
public void query() {
    userMapper.selectOne("贝贝");
    userMapper.selectOne("贝贝");
    userMapper.selectList(23);
}

类似于示例2,只创建一个 sqlSession,并且第 2个语句依然直接使用了缓存

 

 一级缓存可能会出现脏数据(旧缓存没有清除),可参考 聊聊MyBatis缓存机制

 

233

posted on 2019-12-25 22:00  Lemo_wd  阅读(259)  评论(0编辑  收藏  举报

导航