专栏首页mySoulMyBatis 二级缓存
原创

MyBatis 二级缓存

二级缓存

需要在映射文件中添加该标签

	<cache/>

映射语句中的select语句将会被缓存, 映射语句中的insert update delete 语句将会刷新缓存

缓存使用LRU算法回收

现在完整的配置文件如下

<?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.ming.MyBatis.RoleMapper">
	
	<resultMap type="role" id="roleMap">
		<!-- id为主键映射关系 其中数据库中的id为主键 -->
		<id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
		<!-- result为其他基本数据类型和实体类之间的映射 映射关系为role_name 到 roleName之间的映射 数据类型为string到VARCHAR之间的映射关系 -->
		<result column="role_name" property="roleName" javaType="string" jdbcType="VARCHAR"/>
		<!-- 这里使用typeHandler表示遇到此处理集的时候,将会执行com.ming.MyBatis.StringTypeHandler -->
		<result column="note" property="note" typeHandler="com.ming.MyBatis.StringTypeHandler"/>
	</resultMap>
	
	<select id="getRole" parameterType="int" resultType="com.ming.MyBatis.POJO.Role">
		SELECT id, role_name as roleName, note FROM t_role WHERE id = #{id}
	</select>
	
	<select id="findRoleByteMap" parameterType="map" resultMap="roleMap">
		SELECT id, role_name, note FROM t_role
		WHERE role_name LIKE CONCAT('%', #{roleName}, '%')
		AND note LIKE CONCAT('%', #{note}, '%')
	</select>
	
	<select id="findRoleByteMap1" resultMap="roleMap">
		SELECT id, role_name, note FROM t_role
		WHERE role_name LIKE CONCAT('%', #{roleName}, '%')
		AND note LIKE CONCAT('%', #{note}, '%')
	</select>
	
	
	<resultMap id="studentSelfCardMap" type="com.ming.MyBatis.POJO.StudentCard">
		<id column="uid" property="uid"/>
		<result column="student_number" property="studentNumber"/>
		<result column="birthplace" property="birthplace" />
		<result column="date_of_issue" property="dateOfIssue" jdbcType="DATE" javaType="java.util.Date"/>
		<result column="end_date" property="endDate" jdbcType="DATE" javaType="java.util.Date"/>
		<result column="remarks" property="remarks" />
	</resultMap>

	<select id="findStudentSelfCardByStudentId" parameterType="int" resultMap="studentSelfCardMap">
		SELECT student_card.uid, student_card.student_number, student_card.remarks,
		student_card.end_date, student_card.date_of_issue, student_card.birthplace
		FROM student_card WHERE student_card.uid = #{studentId};
	</select>
	
	<resultMap id="studentMap" type="com.ming.MyBatis.POJO.Student">
		<id column="uid" property="uid"/>
		<result column="student_name" property="studentName"/>
		<result column="gender" property="gender"/>
		<result column="student_id_number" property="studentIdNumber"/>
		<result column="remarks" property="remarks"/>
		<!--将会调用接口代表的SQL 进行执行查询 -->
		<association property="studentCard" column="uid" select="com.ming.MyBatis.RoleMapper.findStudentSelfCardByStudentId"/>
	</resultMap>
	
	<select id="getStudent" parameterType="int" resultMap="studentMap">
		SELECT student.uid, student.gender, student.remarks, student.student_id_number,
		student.student_name
		FROM student
		WHERE student.uid = 1;
	</select>
	
	<cache/>
</mapper>

返回的POJO对象需要实现java.io.Serializable的接口

同样也可以修改

	<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

java的几种引用

强引用

Object object = new Object();

这是强引用,当其赋值为null的时候,若内存空间不足,gc会直接清理掉该内存对象

软引用

需要使用SoftReference类,实现软引用

String str = new String("ming");      // 强引用
SoftReference<String> softRef = new SoftReference<String>(str);    // 软引用

这里为软引用

当内存不足时,会转换为软引用,垃圾回收器进行回收

使用场景 浏览器的回退按钮

弱引用

一旦不定时运行的垃圾回收其发现有弱引用对象,将会直接回收该对象

需要使用WeakReference

String str = new String("ming");
WeakReference<String> weakReference = new WeakRefrence<String>(str);

当垃圾回收其扫描到回收对象的时候,会直接进行回收掉

弱引用需要和引用队列联合使用

虚引用

如果一个对象仅仅持有虚引用,那么就和没有一样.使用的是PhantomReference

虚引用要和引用队列一起使用,垃圾回收线程回收该线程时,会发送一个系统通知,达到通知的作用.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DOM概述 选取文档元素

    有些html标签会有name元素,区别于id,name属性的值不必是唯一的,多个元素可能存在相同的名字。

    mySoul
  • thinkphp 路由

    http://localhost:8082/admin/blog/23/ 此时会匹配23内容

    mySoul
  • MyBatis 缓存

    在执行add,update,delete 的时候,会自动清空缓存,避免脏读造成的影响

    mySoul
  • 123-进度条

    经常有同学希望实现进度条的功能。这个功能可以采用现有的模块来实现,这里我来介绍一个简单的进度条模块tqdm。 首先将tqdm安装上

    凯茜的老爸
  • 教你如何拔取百度地图POI兴趣点

    调用聚合数据,首先得注册聚合。聚合数据提供的百度地图POI的接口有三个:数据分类,查询数据和获取周边数据。想要获取百度POI兴趣点,涉及到的接口为数据分类,查询...

    lzugis
  • java入门踩的坑2 【数据库快速入门】2019年8月11日

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • SSM框架之MyBatis3专题3:关联

    1.1.3 定义Dao层接口 public interface ICountryDao { Country selectCountryById(int c...

    py3study
  • 高级vue教程 源码分析

    lilugirl
  • JavaScript实现段落文本高亮

    代码: <!doctype html> <html lang="en"> <head> <meta http-equiv="Content-Type" ...

    用户1174387
  • Mysql常用sql语句(17)- left / right join 外连接

    https://www.cnblogs.com/poloyy/category/1683347.html

    小菠萝测试笔记

扫码关注云+社区

领取腾讯云代金券