Mybatis 事务管理和缓存机制
一级缓存--SqlSession级别
数据库表tb_user

User
package com.example.demo.domain;
public class User {
private Integer id;
private String name;
private String sex;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
UserMapper
package com.example.demo.mapper;
import com.example.demo.domain.User;
import java.util.List;
public interface UserMapper {
User selectUserById(Integer id);
List<User> selectAllUser();
void deleteUserById(Integer id);
}
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.example.demo.mapper.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.example.demo.domain.User">
SELECT * FROM tb_user WHERE id=#{id}
</select>
<select id="selectAllUser" resultType="com.example.demo.domain.User">
SELECT * FROM tb_user
</select>
<delete id="deleteUserById" parameterType="int">
DELETE FROM tb_user WHERE id=#{id}
</delete>
</mapper>
FKSqlSessionFactory
package com.example.demo.factory; 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; public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try {
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
TestOneLevelCache
package com.example.demo.test; import com.example.demo.domain.User;
import com.example.demo.factory.FKSqlSessionFactory;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession; public class TestOneLevelCache {
public static void main(String[] args){
TestOneLevelCache testOneLevelCache=new TestOneLevelCache();
testOneLevelCache.testCache1();
}
public void testCache1(){
SqlSession session= FKSqlSessionFactory.getSqlSession();
UserMapper mapper=session.getMapper(UserMapper.class);
User user=mapper.selectUserById();
System.out.println(user);
User user1=mapper.selectUserById();
System.out.println(user1);
session.close();
}
public void testCache2() {
SqlSession session = FKSqlSessionFactory.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById();
System.out.println(user);
mapper.deleteUserById();
User user1=mapper.selectUserById();
System.out.println(user1);
session.close();
}
}
运行testcache1

可以看到只查询了一次,返回的是同一个对象。
运行testcache2

当SqlSession执行过DML操作(insert,update,delete)并提交到数据库后,Mybatis会清空一级缓存。
新加testCache3方法
public void testCache3(){
SqlSession session = FKSqlSessionFactory.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById();
System.out.println(user);
session.close();
session = FKSqlSessionFactory.getSqlSession();
mapper = session.getMapper(UserMapper.class);
user = mapper.selectUserById();
System.out.println(user);
session.close();
}
运行

此时可以看到查询了两次。
二级缓存--mapper级别
MyBatis默认开启一级缓存,开启二级缓存需要在settings中配置
<settings>
<setting name="cacheEnabled" value="true"></setting>
</settings>
在UserMapper.xml中添加配置
<cache eviction="LRU" flushInterval="" size="" readOnly="true"></cache>
这里添加了一个LRU(最近最少使用策略)缓存,每隔60秒刷新,最大存储512个对象,且返回对象为只读。
TestTwoLevelCache
package com.example.demo.test; import com.example.demo.domain.User;
import com.example.demo.factory.FKSqlSessionFactory;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession; public class TestTwoLevelCache {
public static void main(String[] args){
TestTwoLevelCache testTwoLevelCache=new TestTwoLevelCache();
// testTwoLevelCache.testCache1();
testTwoLevelCache.testCache2();
}
public void testCache1(){
SqlSession session = FKSqlSessionFactory.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById();
System.out.println(user);
mapper.deleteUserById();
User user1=mapper.selectUserById();
System.out.println(user1);
session.close();
}
public void testCache2(){
SqlSession session = FKSqlSessionFactory.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById();
System.out.println(user);
session.close();
session = FKSqlSessionFactory.getSqlSession();
mapper = session.getMapper(UserMapper.class);
user = mapper.selectUserById();
System.out.println(user);
session.close();
}
}
运行testCache2()

可以看到命中缓存了。
Mybatis 事务管理和缓存机制的更多相关文章
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面. 本文将讲述MyBatis的事务管理的实现机制,首先介绍MyBatis的事务Transaction的接口设计以 ...
- mybatis深入理解(三)-----MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- spring+mybatis事务管理
spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- springMVC+mybatis事务管理总结
1.spring,mybatis事务管理配置与@Transactional注解使用: 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framewo ...
- spring,mybatis事务管理配置与@Transactional注解使用
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...
- mybatis事务管理机制详解
1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...
- springboot mybatis 事务管理
本文主要讲述springboot提供的声明式的事务管理机制. 一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优 ...
随机推荐
- 容器,表格 ,div,元素可左右拖动,滚动 css
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- python处理中文
python 清洗中文文件 需要用到的两个链接: 1,unicode编码转换器 http://www.bangnishouji.com/tools/chtounicode.html 2,Python匹 ...
- Verilog中的阻塞与非阻塞
这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...
- 1105 Spiral Matrix
This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasi ...
- (转)EntityFramework.Extensions
转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...
- java理论学时第七节。课后作业。
对AboutException.java的理解.在try中如果发出某类系统识别的错误,会以throw的形式抛出,在catch中可以将其截获,不显示在前端,可以选择执行别的代码. ArrayIndexO ...
- kepware http接口 javascript开发
读取某变量的值(jquery var settings = { "async": true, "crossDomain": true, "url&qu ...
- java基础-day6
第06天 java基础语法 今日内容介绍 u Eclipse断点调试 u 基础语法的练习 第1章 Eclipse断点调试 1.1 Eclipse断点调试概述 Eclipse的断点调试可以 ...
- bootstrap阶段测验【答案】
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 分频器的verilog设计
笔者最近由于实验室老师的任务安排重新又看了一下分频器的verilog实现,现总结如下,待以后查看之用(重点是查看计数器计到哪个值clk_out进行状态翻转) 1.偶数分频占空比为50% 其实质还是一个 ...