乐趣区

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

退出移动版