Mybatis二级缓存

二级缓存(mapper,namespace来区分)
二级缓存图解
在这里插入图片描述
开启二级缓存
1)设置Mybatis配置文件

<?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="cacheEnabled" value="true"/>
    </settings>

    <typeAliases>
        <package name="com.xieli.liu.pojo" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC事务管理,事务控制由mybatis管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--加入映射文件-->
   <mappers>
       <package name="com.xieli.liu.dao"/>
   </mappers>
</configuration>

2)设置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.xieli.liu.dao.UserInfoMapper">
	<!--开启二级缓存-->
	<cache/>
	<resultMap id="userInfoResultMap" type="UserInfo">
		<id column="user_id" property="userId" />
		<result column="group_id" property="groupId" />
		<result column="user_name" property="userName" />
		<result column="nick_name" property="nickName" />
		<result column="user_code" property="userCode" />
		<result column="user_pwd" property="userPwd" />
		<result column="user_type" property="userType" />
		<result column="user_state" property="userState" />
		<result column="is_delete" property="isDelete" />
		<result column="create_by" property="createBy" />
		<result column="create_time" property="createTime" />
		<result column="udate_by" property="udateBy" />
		<result column="update_time" property="updateTime" />
	</resultMap>
	<!-- 查询数据库所有用户信息,用来测试数据库是否连接上 -->
	<select id="selectAll" resultMap="userInfoResultMap">
		select * from User_info
	</select>
</mapper>

3)实体类UserInfo实现序列化(可能会以其他方式存储)
在这里插入图片描述
测试代码
1)不同的sqlSession执行同一SQL

package com.xieli.liu;

import com.xieli.liu.dao.UserInfoMapper;
import com.xieli.liu.pojo.Role;
import com.xieli.liu.pojo.UserInfo;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created by Administrator on 2019-11-20.
 */
public class test {
    public static void main(String arg[]) {
        SqlSessionFactory sessionFactory;
        //使用MyBatis提供的Resources类加载mybatis的配置文件
        try {
            InputStream resourceAsStream = Resources.getResourceAsStream("config/sqlMapConfig.xml");
            //构建sqlSession的工厂
            sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sessionFactory.openSession();
            SqlSession sqlSession2 = sessionFactory.openSession();
            SqlSession sqlSession3 = sessionFactory.openSession();
            UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
            List<UserInfo> userInfos = mapper.selectAll();
            for (UserInfo userInfo: userInfos) {
                    System.out.println(userInfo.getUserName());
            }
            //写入二级缓存
            sqlSession.close();
            UserInfoMapper mapper2 = sqlSession2.getMapper(UserInfoMapper.class);
            //发起第二次查询
            List<UserInfo> userInfos2  =mapper2.selectAll();
            for (UserInfo userInfo: userInfos2) {
                System.out.println(userInfo.getUserName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

结果总结:
第二次查询没有执行SQL,直接从二级缓存中获取
2)不同的sqlSession执行同一SQL,中间夹杂对数据库的操作

package com.xieli.liu;

import com.xieli.liu.dao.UserInfoMapper;
import com.xieli.liu.pojo.Role;
import com.xieli.liu.pojo.UserInfo;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created by Administrator on 2019-11-20.
 */
public class test {
    public static void main(String arg[]) {
        SqlSessionFactory sessionFactory;
        //使用MyBatis提供的Resources类加载mybatis的配置文件
        try {
            InputStream resourceAsStream = Resources.getResourceAsStream("config/sqlMapConfig.xml");
            //构建sqlSession的工厂
            sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sessionFactory.openSession();
            SqlSession sqlSession2 = sessionFactory.openSession();
            SqlSession sqlSession3 = sessionFactory.openSession();
            //发起第一次查询
            UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
            List<UserInfo> userInfos = mapper.selectAll();
            for (UserInfo userInfo: userInfos) {
                    System.out.println(userInfo.getUserName());
            }
            //写入二级缓存
            sqlSession.close();
            
            //对数据库进行操作
            UserInfoMapper mapper3 = sqlSession3.getMapper(UserInfoMapper.class);
            UserInfo u=new UserInfo();
            u.setUserState("1");
            mapper3.updateStatics(u);
            sqlSession3.commit();
            sqlSession3.close();

            //发起第二次查询
            UserInfoMapper mapper2 = sqlSession2.getMapper(UserInfoMapper.class);
            List<UserInfo> userInfos2  =mapper2.selectAll();
            for (UserInfo userInfo: userInfos2) {
                System.out.println(userInfo.getUserName());
            }
            sqlSession2.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

结果总结:
对数据库操作会清空二级缓存。
第二次查询执行SQL,没有从二级缓存中获取。
禁用二级缓存

<select id="selectAll" resultMap="userInfoResultMap" useCache="false">
		select * from User_info
	</select>

清空缓存

<select id="selectAll" resultMap="userInfoResultMap" flushCache="true">
		select * from User_info
	</select>

清空缓存,不是重新从数据库复制数据

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桀骜浮沉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值