MyBatis研习录(13)——MyBatis二级缓存

Mybatis研习录
笨鸟向东飞
谷哥的小弟

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

使用二级缓存的前期准备

在MyBatis中使用二级缓存之前,需要进行如下配置:

1、在mybatis-config.xml中开启二级缓存

  <settings>
    <!-- 开启二级缓存 -->
	<setting name="cacheEnabled" value="true"/>
  </settings>

2、xxxMapper.xml中使用catch标签

<!-- 使用二级缓存 -->
<cache></cache>

3、pojo实现Serializable接口

public class YourPojo implements Serializable{ }

二级缓存的使用说明

当MyBatis中开启二级缓存,那么缓存的使用顺序如下:

  • 1、当执行查询语句时候会先去二级缓存中查询数据,如果有则返回。如果二级缓存中没有则到一级缓存中查找。
  • 2、如果一级缓存中有,则返回。如果一级缓存也没有则发送sql语句到数据库中去查询。
  • 3、从数据库查询出数据后立马将数据保存到一级缓存中。
  • 4、当SqlSession关闭的时候把一级缓存中的数据保存到二级缓存中。

请注意:如果执行增 、删、改 那么会同时清除一级缓存和二级缓存

二级缓存使用示例

数据准备

DROP DATABASE IF EXISTS mybatisDatabase;
CREATE DATABASE mybatisDatabase;
use mybatisDatabase;
CREATE TABLE user(
  id INT PRIMARY KEY auto_increment,
  username VARCHAR(50),
  password VARCHAR(50),
  gender VARCHAR(10)
);

INSERT INTO user(username,password,gender) VALUES("lucy","123456","female");
INSERT INTO user(username,password,gender) VALUES("momo","234567","female");
INSERT INTO user(username,password,gender) VALUES("xixi","345678","female");
INSERT INTO user(username,password,gender) VALUES("pepe","456123","female");

SELECT * FROM user;

搭建开发环境

创建普通的Java工程,结构如下:
在这里插入图片描述

User

package cn.com.pojo;

import java.io.Serializable;

/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class User implements Serializable{
	private static final long serialVersionUID = 112149170027586026L;
	private Integer id;
	private String username;
	private String password;
	private String gender;
	public User() {
		
	}

	public User(Integer id, String username, String password, String gender) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.gender = gender;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + ", gender=" + gender + "]";
	}
	
}

UserMapper .java

package cn.com.mapper;

import cn.com.pojo.User;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public interface UserMapper {
	
	public User queryUserById(Integer id);
	
	public int updateUser(User user);
}

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="cn.com.mapper.UserMapper">	

  <!-- 使用二级缓存 -->
  <cache></cache>
  
  <select id="queryUserById" parameterType="java.lang.Integer" resultType="cn.com.pojo.User">
    select id,username,password,gender from user where id = #{id}
  </select>
  
  <update id="updateUser" parameterType="cn.com.pojo.User">
     update user set username=#{username},password=#{password},gender=#{gender} where id=#{id}
  </update>
  
</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

  <settings>
    <!-- 开启二级缓存 -->
	<setting name="cacheEnabled" value="true"/>
  </settings>
  
  <!-- 配置数据源 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatisDatabase"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  
  <!-- 配置mapper -->
  <mappers>
    <mapper resource="cn/com/pojo/UserMapper.xml"/>
  </mappers>
  
</configuration>

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

MybatisTest

package cn.com.test;

import java.io.InputStream;
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 org.junit.Test;
import cn.com.mapper.UserMapper;
import cn.com.pojo.User;
/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class MybatisTest {

	static SqlSessionFactory sqlSessionFactory = null;

	public static SqlSessionFactory getSqlSessionFactory() {
		try {
			if (sqlSessionFactory == null) {
				InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
				SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
				sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
			}
			return sqlSessionFactory;
		} catch (Exception e) {
			// TODO: handle exception
		} finally {

		}
		return null;
	}
	
	public void sqlSessionCatch() {
		//获取SqlSession
		SqlSession sqlSession=getSqlSessionFactory().openSession();
		//利用SqlSession得到UserMapper
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		//利用SqlSession执行数据查询
		User user = userMapper.queryUserById(1);
		System.out.println(user.getUsername());
		//关闭SqlSession
		sqlSession.close();
	}
	@Test
	public void testSqlSessionCatch() {
		sqlSessionCatch();
		sqlSessionCatch();
		sqlSessionCatch();
		sqlSessionCatch();
	}
	
	public void sqlSessionCatchClean() {
		//获取SqlSession
		SqlSession sqlSession=getSqlSessionFactory().openSession();
		//利用SqlSession得到UserMapper
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		//利用SqlSession执行数据查询
		User user = userMapper.queryUserById(1);
		System.out.println(user.getUsername());
		//利用SqlSession执行数据更新
		userMapper.updateUser(new User(2, "bmbm", "123456", "female"));
		//关闭SqlSession
		sqlSession.close();
	}
	
	@Test
	public void testSqlSessionCatchClean() {
		sqlSessionCatchClean();
		sqlSessionCatchClean();
		sqlSessionCatchClean();
		sqlSessionCatchClean();
	}

}

testSqlSessionCatch测试结果如下:

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1392425346.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - ==>  Preparing: select id,username,password,gender from user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
lucy
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Returned connection 1392425346 to pool.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.5
lucy
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.6666666666666666
lucy
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.75
lucy

请注意命中率Cache Hit Ratio的变化:

  • 1、第一次查询时无缓存,所以Cache Hit Ratio=0
  • 2、第二次查询时有缓存,共两次查询其中一次来自于缓存;所以,Cache Hit Ratio=0.5
  • 3、第三次查询时有缓存,共三次查询其中二次来自于缓存;所以,Cache Hit Ratio=0.66666666666666666666
  • 4、第四次查询时有缓存,共四次查询其中三次来自于缓存;所以,Cache Hit Ratio=0.75

testSqlSessionCatchClean测试结果如下:

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1392425346.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - ==>  Preparing: select id,username,password,gender from user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
lucy
DEBUG [main] - ==>  Preparing: update user set username=?,password=?,gender=? where id=? 
DEBUG [main] - ==> Parameters: bmbm(String), 123456(String), female(String), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Returned connection 1392425346 to pool.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1392425346 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - ==>  Preparing: select id,username,password,gender from user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
lucy
DEBUG [main] - ==>  Preparing: update user set username=?,password=?,gender=? where id=? 
DEBUG [main] - ==> Parameters: bmbm(String), 123456(String), female(String), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Returned connection 1392425346 to pool.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1392425346 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - ==>  Preparing: select id,username,password,gender from user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
lucy
DEBUG [main] - ==>  Preparing: update user set username=?,password=?,gender=? where id=? 
DEBUG [main] - ==> Parameters: bmbm(String), 123456(String), female(String), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Returned connection 1392425346 to pool.
DEBUG [main] - Cache Hit Ratio [cn.com.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1392425346 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - ==>  Preparing: select id,username,password,gender from user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
lucy
DEBUG [main] - ==>  Preparing: update user set username=?,password=?,gender=? where id=? 
DEBUG [main] - ==> Parameters: bmbm(String), 123456(String), female(String), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@52feb982]
DEBUG [main] - Returned connection 1392425346 to pool.

在此测试中命中率Cache Hit Ratio=0;再次验证了:如果执行增 、删、改 那么会同时清除一级缓存和二级缓存

二级缓存策略

MyBatis二级缓存常用策略如下:

• LRU – 最近最少使用的,即移除最长时间不被使用的对象(默认策略)。
• FIFO – 先进先出,即按对象进入缓存的顺序来移除它们。
• SOFT – 软引用,即移除基于垃圾回收器状态和软引用规则的对象。
• WEAK – 弱引用,即更积极地移除基于垃圾收集器状态和弱引用规则的对象。

展开阅读全文

专为程序员设计的数学课

11-11
<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 1、原价 115 元,限时特价仅需 49 元!<br> 2、购课后添加学习助手(微信号:csdnxy68),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdnxy68</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

01-19
想学好JAVA必须要报两万的培训班吗? Java大神勿入 如果你: 零基础想学JAVA却不知道从何入手 看了一堆书和视频却还是连JAVA的环境都搭建不起来 囊中羞涩面对两万起的JAVA培训班不忍直视 在职没有每天大块的时间专门学习JAVA 那么恭喜你找到组织了,在这里有: 1. 一群志同道合立志学好JAVA的同学一起学习讨论JAVA 2. 灵活机动的学习时间完成特定学习任务+每日编程实战练习 3. 热心助人的助教和讲师及时帮你解决问题,不按时完成作业小心助教老师的家访哦 上一张图看看前辈的感悟:     大家一定迫不及待想知道什么是极简JAVA学习营了吧,下面就来给大家说道说道: 什么是极简JAVA学习营? 1. 针对Java小白或者初级Java学习者; 2. 利用9天时间,每天1个小时时间; 3.通过 每日作业 / 组队PK / 助教答疑 / 实战编程 / 项目答辩 / 社群讨论 / 趣味知识抢答等方式让学员爱上学习编程 , 最终实现能独立开发一个基于控制台的‘库存管理系统’ 的学习模式 极简JAVA学习营是怎么学习的?   如何报名? 只要购买了极简JAVA一:JAVA入门就算报名成功!  本期为第四期极简JAVA学习营,我们来看看往期学员的学习状态: 作业看这里~   助教的作业报告是不是很专业 不交作业打屁屁 助教答疑是不是很用心   有奖抢答大家玩的很嗨啊     项目答辩终于开始啦   优秀者的获奖感言   这是答辩项目的效果     这么细致的服务,这么好的氛围,这样的学习效果,需要多少钱呢? 不要1999,不要199,不要99,只要9.9 是的你没听错,只要9.9以上所有就都属于你了 如果你: 1、 想学JAVA没有基础 2、 想学JAVA没有整块的时间 3、 想学JAVA没有足够的预算 还等什么?赶紧报名吧,抓紧抢位,本期只招300人,错过只有等时间待定的下一期了   报名请加小助手微信:eduxy-1    
©️2020 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客 返回首页
实付99.00元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值