二级缓存(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&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>
清空缓存,不是重新从数据库复制数据