一级缓存--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. 2018-04-11 activity周期

    android相机开发 1.Android wifi热点连接过程 2.bindservice和AIDLhttps://blog.csdn.net/zhou_wenchong/article/detai ...

  2. noip第19课作业

    1. 谁考了第K名 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩. [输入格式] 第一行有两个整数,分别是学生的人数n(1<=n<=100 ...

  3. linux中的amount的解释

    挂载(amount)概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为“挂载点”,解除此关联关系的过程称之为“卸载 ...

  4. [violet2]sillyz

    题意:定义S(n) = n*各数位之积,然后给定L<=R<=10^18,求有多少个n在[L,R]区间内 思路: 看了半天无从下手..看完题解才豁然开朗.. 具体思路看vani神博客吧.讲的 ...

  5. 转:Ubuntu 10.10 安装后上不了网的原因

    最近新装了个Ubuntu10.10 发现上不了网,折腾了很久,在网上找了很多办法都不行,最后试了一招居然管用了.特此总结下Ubuntu了网的原因及对策分析. 环境:Ubuntu 10.10网络: 通过 ...

  6. iOS笔记之UIKit_UINavigationController

    //设置导航条的样式 self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; //默认是白色  B ...

  7. Python自动化开发 -进程、线程和协程(二)

    本节内容 一.线程进程介绍 二. 线程 1.线程基本使用 (Threading) 2.线程锁(Lock.RLock) 3.信号量(Semaphore) 4.事件(event) 5.条件(Conditi ...

  8. 从0开始学Python---01

    1.开始 Vim  test.py #!/usr/bin/python print "hello,world!"; chmod +x test.py ./test.py 2.基本知 ...

  9. 一场关于 .net core 和 .net framework 编码的案情分析

    案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...

  10. WPF 网易云音乐PC端

    简介 (1)左侧菜单采用 Expander+RadioButton: MVVM 绑定 后台的一个Menu 属性(使用转换器) (2)右侧采用Frame绑定Page的方式 ## [更新日志] ### 1 ...