一级缓存--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 事务管理和缓存机制的更多相关文章

  1. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  2. MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.   本文将讲述MyBatis的事务管理的实现机制,首先介绍MyBatis的事务Transaction的接口设计以 ...

  3. mybatis深入理解(三)-----MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  4. spring+mybatis事务管理

    spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...

  5. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  6. springMVC+mybatis事务管理总结

    1.spring,mybatis事务管理配置与@Transactional注解使用: 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framewo ...

  7. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

  8. mybatis事务管理机制详解

    1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...

  9. springboot mybatis 事务管理

    本文主要讲述springboot提供的声明式的事务管理机制. 一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优 ...

随机推荐

  1. spring mvc项目中导出excel表格简单实现

    查阅了一些资料,才整理出spring mvc 项目导出excel表格的实现,其实很是简单,小计一下,方便以后查阅,也希望帮助有需要的朋友. 1.导入所需要依赖(Jar包).我使用的是maven,所以坐 ...

  2. Andorid第一次作业

    一.作业截图 二.项目路径 https://git.coding.net/bestimbalance/Android.git 三.小组成员 邢路:  https://www.cnblogs.com/x ...

  3. django基础操作

    web应用程序:可以通过web访问的应用程序 bs/cs架构 http协议 基于TCP/IP协议之上的应用层协议 基于请求-响应模式:客户端先发送请求,服务端再响应 无状态保存:http协议对于发送的 ...

  4. 20171123IdleHandler

    在Android中,我们可以处理Message,这个Message我们可以立即执行也可以delay 一定时间执行.Handler线程在执行完所有的Message消息,它会wait,进行阻塞,知道有心的 ...

  5. Write Markdown Syntax Online Document with Sphinx and Pandoc

    There is no doubt that we have to write doc while we are developing software. But How do you write d ...

  6. Java中方法重写和方法重载

     首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...

  7. JavaScript常用事件参考

      onabort 图像加载被中断 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onerror 当加载文档 ...

  8. javascript 模块化编程

    The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...

  9. 04:第一个OC类

    1.类与对象的关系 面向对象的核心就是对象,那怎么创建对象? OC中创建对象比较复杂, 首先要理解一个概念叫做类. 现实生活中是根据一份描述,一份模板创建对象,编程语言也一样,也必须先有一份描述,在这 ...

  10. js加减运算·传参

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...