一级缓存--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. POJ3104--Drying(Binary Search)

    It is very hard to wash and especially to dry clothes in winter. But Jane is a very smart girl. She ...

  3. 第78讲:Type与Class实战详解

    今天来学习下type与class解析 让我们先来看看代码 import scala.reflect.runtime.universe._ class Sparktrait Hadoopobject F ...

  4. hdu 4282 枚举,非二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4282 对于方程X^Z + Y^Z + XYZ = K,已知K求此方程解的个数,其中要求X<Y,Z>1 ...

  5. UT源码105032014098

    (2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...

  6. poj3929

    题意: 如上图放置的一个圆锥,告诉你从圆锥顶的洞中流出多少体积的水,求现在水面高度.. 思路: 无聊时做的一道题,实际上就是一道高数题,重积分,可惜我高数本来也不好而且还忘光了,积了很久,而且错了很多 ...

  7. [控件]unigui移动端下Unidatepicker时间显示解决方案

    [控件]unigui移动端下Unidatepicker时间显示解决方案 http://tz10000.com/kong-jian-unigui-yi-dong-duan-xia-unidatepick ...

  8. 我的ecshop二次开发经验分享

    https://jingyan.baidu.com/article/358570f65dbad2ce4724fcc7.html

  9. ora-12154 TNS:无法处理服务名疑难处理

    折腾了几天的PLSQL,终于解决这个问题,在此分享给需要的朋友 服务器:WindowsServer2008(64位操作系统).Win7(64位操作系统) Oracle版本:10.2.0 问题:安装完O ...

  10. 多条件情况查询,sql select case when when else

    多条件情况查询 SELECT      Title,     'Price Range' =     CASE         WHEN price IS NULL THEN 'Unpriced'   ...