Mybatis 缓存


一级缓存

范围在一次sqlsession中
如果执行了sqlSession.close();,缓存就消失了。

二级缓存



步骤

<!--显示的开启-->
        <setting name="cacheEnabled" value="true"/>

类中实现序列化接口

package pojo;

import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {
    private int id;
    private String name;
    private String pwd;
}

<?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">
<!--namespace对应接口名字-->
<mapper namespace="dao.BlogMapper">
    <!--开启二级缓存-->
    <cache/>
    <!--设置useCache属性-->
    <select id="queryUserByid" parameterType="int" resultType="user" useCache="true">
        select * from user where id=#{id}
    </select>
</mapper>

主程序

import dao.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utiles.MybatisUtiles;

public class Mytest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtiles.getSqlSession();
        SqlSession sqlSession1=MybatisUtiles.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        UserMapper mapper1=sqlSession1.getMapper(UserMapper.class);
        User user = mapper.queryUserByid(1);
        System.out.println(user);
        sqlSession.close();
        //此时一次sqlSession执行完毕 二级缓存已经存在 用不同的sqlSession去执行语句也会使用缓存
        User user1=mapper1.queryUserByid(1);
        System.out.println(user);
        sqlSession1.close();
    }
}


红箭头位置为第一次查询,蓝箭头为第二次查询可以看到去直接使用缓存

缓存顺序

先二后一 都没有就执行Sql语句

posted @ 2021-04-11 20:57  一个经常掉线的人  阅读(44)  评论(0)    收藏  举报