MyBatis一级缓存

举报
Java李杨勇 发表于 2022/08/31 20:41:10 2022/08/31
【摘要】 一级缓存mybatis的缓存大家应该知道、有一级缓存和二级缓存,一级缓存是基于MyBatis自带的HashMap本地缓存,作用范围为session域内。当 session flush或者 close之后,该 session中所有的 cache就会被清空。在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因...

一级缓存

mybatis的缓存大家应该知道、有一级缓存和二级缓存,一级缓存是基于MyBatis自带的HashMap本地缓存,作用范围为session域内。当 session flush或者 close之后,该 session中所有的 cache就会被清空。

在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis会将其放在缓存里面去,

再次查询时,如果没有刷新并且缓存没有超时的情况下,SqlSession会取出当前缓存数据,不会再次发送 SQL到数据库执行查询。
由于SqlSession 之间是相互隔离的,所以如果使用不同的SqlSession对象,即使调用相同的 Mapper参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果的。

在 WebsiteMapper 类中添加 selectWebsiteById 方法,代码如下。

public Website selectWebsiteById(int id);

WebsiteMapper.xml 中添加相应的映射 SQL 语句,代码如下。

 <select id="selectWebsiteById"
 resultType="com.po.Website">
SELECT * FROM website
 WHERE id=#{id}
  </select>

测试代码参考如下。


public class Test {
    public static Logger logger = Logger.getLogger(Test.class);
    public static void main(String[] args) throws IOException {
        InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); 
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
        SqlSession ss = sqlSessionFactory.openSession();

        Website site = ss.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
        logger.debug("使用同一个sqlsession再执行一次...");
        Website site2 = ss.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
       
        ss.commit();
        logger.debug("现在创建一个新的SqlSeesion对象在执行一次...");
        SqlSession ss2 = ssf.openSession();
        Website site3 = ss2.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
        ss2.commit();
    }

运行结果如下。

DEBUG [main] - ==>  Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - 使用同一个sqlsession再执行一次
DEBUG [main] - 现在创建一个新的SqlSeesion对象在执行一次
DEBUG [main] - ==>  Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)

从运行结果可以看出,第一个SqlSession只发生过一次查询,
而第二次查询就从缓存中取出了。

大家点赞、收藏、关注、评论啦 、打卡 文章 更新 268/  365天

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。