关于mybatis一级缓存和二级缓存

mybatis 缓存

通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数

mybatis 提供两种缓存机制:一级缓存 和 二级缓存

在这里插入图片描述

一级缓存

mybatis 自带一级缓存无需另外开启(无法关闭),数据存储在Sqlsession中,作用范围在同一个Sqlsessi,当使用Sqlsession对象第一次执行sql语句时,数据会自动存入Sqlsession对象,第二次使用直接从Sqlsession对象中获取

Java代码

InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = build.openSession();
        BorrowsMapper mapper = sqlSession.getMapper(BorrowsMapper.class);
        Borrows borrows1 = mapper.findById("1100011");
        Borrows borrows2 = mapper.findById("1100011");
        System.out.println(borrows1);
        System.out.println(borrows2);
        

执行结果

第二次查询语句并没有执行sql语句

二级缓存

二级缓存默认关闭需要手动开启,作用域范围比一级缓存要大,为Mapper级别,只要是来自同一个Mapper.xml/Mapper接口,无论是否通过同一个SqlSession对象,都可以共用缓存
开启方法:
  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>
        <!--打印sql-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
  1. Mapper.xml(对应接口的映射文件) 中配置二级缓存
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.eleven.mapper.CardMapper">
    <select id="findById" parameterType="java.lang.String" resultType="Card">
        select * from Card where CNO = #{CNO}
    </select>

    <cache></cache>

</mapper>

  1. 实体类实现序列化接口
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card  implements Serializable {
    private String CNO;
    private String NAME;
    private String CLASS;

}

Java代码

   InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream);
        //创建两个SqlSession对象
        SqlSession sqlSession1 = build.openSession();
        SqlSession sqlSession2 = build.openSession();
        
        CardMapper mapper1 = sqlSession1.getMapper(CardMapper.class);
        CardMapper mapper2 = sqlSession2.getMapper(CardMapper.class);
        //分别用不同的对象执行两次相同sql语句
        System.out.println(mapper1.findById("sx001"));
        //只有一级缓存失效,才会启动二级缓存 若没关闭则两个对象分别执行各自的sql语句
        sqlSession1.close();
        System.out.println(mapper2.findById("sx001"));

执行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值