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注解的方式获得支持,这种方式的优 ...
随机推荐
- jquery实现图片上传前本地预览功能
HTML <img id="pic" src="" > <input id="upload" name="fil ...
- hibernate之helloword(环境搭建)
环境搭建 hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- (最长公共子序列 暴力) Common Subsequence (poj 1458)
http://poj.org/problem?id=1458 Description A subsequence of a given sequence is the given sequence w ...
- Linux常用备份恢复工具
在 Linux 中可以通过各种各样的方法来执行备份.所涉及的技术从非常简单的脚本驱动的方法,到精心设计的商业化软件.备份可以保存到远程网络设备.磁带驱动器和其他可移动媒体上.备份可以是基于文件的或基于 ...
- javascript 模块化编程
The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...
- 入手IntelliJ IDEA 常用配置
Idea常用设置 下载地址:https://www.jetbrains.com/idea/ 激活服务器:http://idea.iteblog.com/key.php 代码补全取消区分大小写 Inte ...
- Hive为什么要分桶
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...
- ES基本查询
数据准备 # 创建索引PUT /lib1{ "settings": { "number_of_shards": 5 , "number_o ...
- Hadoop MapReduce Task Log 无法查看syslog问题
现象: 由于多个map task共用一个JVM,所以只输出了一组log文件 datanode01:/data/hadoop-x.x.x/logs/userlogs$ ls -R .: attempt_ ...
- iOS Document Interaction(预览和打开文档) 编程指南
原文:http://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/DocumentInteracti ...