Mybatis一级与二级缓存详细的深入了解(含SSM和SpringBoot项目中如何打开Mybatis的SQL语句打印)

Mybatis缓存详细的深入了解

1.SSM项目中如何打开Mybatis的SQL语句打印

1.1 配置mybatis-config.xml
<?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="logImpl" value="STDOUT_LOGGING" />
    </settings>
</configuration>
1.2 在spring配置文件中添加mybatis的配置文件路径
	<!--配置sqlsession工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描mybatis配置文件 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 自动扫描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:school/*.xml"/>
    </bean>

2.SpringBoot项目中如何打开Mybatis的SQL语句打印

# 打印sql
logging:
  level:
  	 # 你的dao接口层包路径
     com.example.demo.dao : debug

3.Mybatis的一级缓存(默认情况下都处于开启状态)

	@Test
    public void test14(){
        System.out.println("第一次");
        studentService.selectByNameDim("大").forEach(System.out::print);

        System.out.println("第二次");
        studentService.selectByNameDim("大").forEach(System.out::print);

    }
可上面的代码打印了两次SQL查询语句,是一级缓存失效了吗,不是,原因如下
mybatis的一级缓存生效的范围是sqlsession,是为了在sqlsession没有关闭时,业务需要重复查询相同数据使用的。一旦sqlsession关闭,则由这个sqlsession缓存的数据将会被清空,同一线程里面两次查询同一数据所使用的sqlsession是不相同的,所以,给人的印象就是结合spring后,mybatis的一级缓存失效了。
所以mybatis与spring整合后,因为每次都进行创建新的sqlsession,所以就用不上sqlSession的缓存了.

4.Mybatis的二级缓存(二级缓存默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的)

4.1修改mapper的xml文件
	<!-- 在需要使用耳机缓存的地方配置cache -->
  	<cache eviction="LRU" readOnly="true" size="1024" />
4.2 体验测试Mybatis二级缓存
	@Test
    public void test14(){
        System.out.println("第一次");
        studentService.selectByNameDim("大").forEach(System.out::print);

        System.out.println("");

        System.out.println("第二次");
        studentService.selectByNameDim("大").forEach(System.out::print);

    }

在这里插入图片描述

可以看到第二次查询并没有去数据库查询,而是在二级缓存中命中了,命中率为0.5

在这里插入图片描述

5.总结

当二级缓存开启后,同一个命名空间(namespace) 所有的操作语句,都影响着一个共同的 cache,也就是二级缓存被多个 SqlSession 共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。一级缓存和二级缓存都很相似,只是作用域不一样,一级缓存是SqlSession ,二级缓存是同一个命名空间(namespace),而他们中间只要有插入删除更新操作将会清除缓存全部。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值