Mybatis的一级缓存和二级缓存

Java 975℃

1.一级缓存

一级缓存是SqlSession级别的缓存,Mybatis默认是开启的,当调用SqlSession的修改、添加、删除、commit()、close()等方法时,就会清空一级缓存。

2.二级缓存

二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句是共用二级缓存的,二级缓存是跨SqlSession的。

3.使用二级缓存

在全局配置文件SqlMapConfig.xml中的settings标签中开启二级缓存:

<!-- 开启二级缓存,cacheEnabled默认是true,所以这一步可忽略 -->
<setting name="cacheEnabled" value="true"/>

然后编写实体类,这里以User表为例,代码可参考:IDEA中Maven工程的MyBatis快速入门。然后编写实体类对应的UserMapper.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.gqzzw.mapper.UserMapper">
    <!--  useCache属性为true代表该sql语句使用二级缓存  -->
    <select id="findById" resultType="com.gqzzw.domain.User" parameterType="int" useCache="true">
        select * from user where id=#{id};
    </select>
    <!--  cache标签代表该mapper启用二级缓存  -->
    <cache></cache>
</mapper>

编写测试类:

package com.gqzzw.mapper;

import com.gqzzw.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserMapperTset {
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession sqlSession;
    private UserMapper userMapper;

    @Before
    public void init() throws IOException {
        //读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //使用构建者创建工厂对象SqlSessionFactory
        factory = builder.build(in);
        //使用SqlSessionFactory产SqlSession对象生
        sqlSession = factory.openSession();
        //产SqlSession对象时可以传true代表自动提交事务
        //sqlSession = factory.openSession(true);
        //使用SqlSession创建映射接口的代理对象
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void destroy() throws IOException {
        //提交事务,释放资源
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    @Test
    //测试二级缓存
    public void findById(){
        System.out.println(userMapper.findById(41));
        //关闭一级缓存
        sqlSession.close();
        //重新获取sqlSession和Mapper
        sqlSession = factory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
        //这里日志没有向数据库发送语句,说明二级缓存生效
        System.out.println(userMapper.findById(41));

    }

}

转载请注明:零五宝典 » Mybatis的一级缓存和二级缓存