1.Mybatis简介
官方文档:mybatis – MyBatis 3 | Introductionhttps://mybatis.org/mybatis-3/
Mybatis是一个半自动化的持久化(ORM)层框架。它的出现主要是为了解决JDBC和sql语句耦合度较高的问题,Mybatis框架将dao成写成mapper,直接将sql写到对应的配置文件中是实现解耦的目的,而且还将执行sql的过程封装到了框架中。
Mybatis与Hibernate对比
Mybatis是一个半自动化【需要手写SQL】
Hibernate是全自动化【无需手写SQL】
Mybatis与JDBC对比
JDBC中的SQL与Java代码耦合度高
Mybatis将SQL与Java代码解耦
数据库搭建源代码
stu_info表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for stu_info
-- ----------------------------
DROP TABLE IF EXISTS `stu_info`;
CREATE TABLE `stu_info` (
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '学生名字',
`id` int NOT NULL AUTO_INCREMENT,
`aliases` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of stu_info
-- ----------------------------
INSERT INTO `stu_info` VALUES ('张三', 1, '小花');
INSERT INTO `stu_info` VALUES ('李华', 2, '笑话');
INSERT INTO `stu_info` VALUES ('李三', 3, '小李');
INSERT INTO `stu_info` VALUES ('小三', 4, '破坏者');
SET FOREIGN_KEY_CHECKS = 1;
user表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`registered_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`role_id` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username` ASC) USING BTREE,
UNIQUE INDEX `email`(`email` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (3, 'user1', 'password123', 'user1@example.com', '2024-07-03 14:30:00', 1);
INSERT INTO `user` VALUES (4, 'editor', 'editpass123', 'editor@example.net', '2024-07-03 15:05:45', 3);
INSERT INTO `user` VALUES (5, 'moderator', 'modpass789', 'moderator@example.org', '2024-07-04 11:17:23', 4);
INSERT INTO `user` VALUES (6, 'testuser', 'test1234', 'testuser@example.io', '2024-07-05 10:00:00', 1);
INSERT INTO `user` VALUES (7, 'guest', 'guest123', 'guest@example.info', '2024-07-06 13:30:00', 1);
INSERT INTO `user` VALUES (8, 'poweruser', 'powerpass987', 'poweruser@example.biz', '2024-07-07 12:45:00', 2);
INSERT INTO `user` VALUES (9, 'developer', 'devpass456', 'developer@example.dev', '2024-07-08 11:20:30', 3);
INSERT INTO `user` VALUES (10, 'analyst', 'analyzepass', 'analyst@example.data', '2024-07-09 10:15:00', 4);
INSERT INTO `user` VALUES (15, 'zhangsan', '123456', '45562154@qq.com', '2024-07-02 18:05:50', 3);
INSERT INTO `user` VALUES (19, '李四', '123456', 'zhangsan1@example.com', '2024-07-13 07:16:00', 3);
SET FOREIGN_KEY_CHECKS = 1;
user_role表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`role_id` int NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
PRIMARY KEY (`role_id`) USING BTREE,
UNIQUE INDEX `role_name`(`role_name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (1, '人事部', '人事招聘');
INSERT INTO `user_role` VALUES (2, '研发部', '技术研发');
INSERT INTO `user_role` VALUES (3, '市场部', '市场开拓');
INSERT INTO `user_role` VALUES (4, '财务部', '财务管理与会计');
INSERT INTO `user_role` VALUES (5, '销售部', '产品销售与客户服务');
INSERT INTO `user_role` VALUES (6, '运营部', '日常运营与流程优化');
INSERT INTO `user_role` VALUES (7, '设计部', '产品与界面设计');
INSERT INTO `user_role` VALUES (8, '后勤部', '公司后勤支持与资产管理');
INSERT INTO `user_role` VALUES (9, '法务部', '法律咨询与合规管理');
INSERT INTO `user_role` VALUES (10, '战略部', '企业战略规划与发展');
SET FOREIGN_KEY_CHECKS = 1;
2.搭建Mybatis框架
实际上是在maven项目中整合Mybatiis,再通俗点就是在maven项目中导入Mybatis的包使用。
搭建流程:
导入依赖【jar包】 --> 编写配置文件 --> 调用核心类库
①配置pom.xml文件
在本次demo中使用的依赖主要有,
<!--导入MySQL的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!--导入MyBatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--单元测试用-->
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 记录运行日志-->
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
②搭建数据库
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for stu_info
-- ----------------------------
DROP TABLE IF EXISTS `stu_info`;
CREATE TABLE `stu_info` (
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '学生名字',
`id` int NOT NULL AUTO_INCREMENT,
`aliases` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of stu_info
-- ----------------------------
INSERT INTO `stu_info` VALUES ('张三', 1, '小花');
INSERT INTO `stu_info` VALUES ('李华', 2, '笑话');
INSERT INTO `stu_info` VALUES ('李三', 3, '小李');
INSERT INTO `stu_info` VALUES ('小三', 4, '破坏者');
SET FOREIGN_KEY_CHECKS = 1;
③Pojo对象
构建实体类--Studentl.java
package com.gmu.pojo;
public class Student {
private Integer id;
private String name;
private String aliases;
public Student(Integer id, String name, String aliases) {
this.id = id;
this.name = name;
this.aliases = aliases;
}
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 getaliases() {
return aliases;
}
public void setaliases(String aliases) {
this.aliases = aliases;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", aliases='" + aliases + '\'' +
'}';
}
}
④ 构建StudentMapper接口
---> StudentMapper.java
public interface StudentMapper {
/**
* 根据id查询学生信息
*/
public Student selectStudentById(int id);
}
⑤配置mybatis核心配置文件 --- mybatis-config.xml
主要配置连接数据库的相关内容,将XXXmapper.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/stu_db"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</dataSource>
</environment>
</environments>
<!-- 设置映射文件路径-->
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
⑥mapper映射文件
<?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.gmu.mapper.StudentMapper">
<select id="selectStudentById" resultType="com.gmu.pojo.Student">
SELECT
id,
name,
aliases
FROM
stu_info
WHERE
id=#{id}
</select>
</mapper>
到这里完整的mybatis框架搭建已经完毕了
⑦测试Mybatis与数据库的交互
StudentMapperTest.java
import com.gmu.mapper.StudentMapper;
import com.gmu.pojo.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class StudentMapperTest {
@Test
public void testSelecrtById() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取mapper对象的代理对象
StudentMapper studentMapper = sqlSessionFactory.openSession().getMapper(StudentMapper.class);
Student student = studentMapper.selectStudentById(1);
System.out.println("student = " + student);
}
}
3.参数传递与返回结果映射
数据库搭建
表一
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`role_id` int NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
PRIMARY KEY (`role_id`) USING BTREE,
UNIQUE INDEX `role_name`(`role_name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (1, '人事部', '人事招聘');
INSERT INTO `user_role` VALUES (2, '研发部', '技术研发');
INSERT INTO `user_role` VALUES (3, '市场部', '市场开拓');
INSERT INTO `user_role` VALUES (4, '财务部', '财务管理与会计');
INSERT INTO `user_role` VALUES (5, '销售部', '产品销售与客户服务');
INSERT INTO `user_role` VALUES (6, '运营部', '日常运营与流程优化');
INSERT INTO `user_role` VALUES (7, '设计部', '产品与界面设计');
INSERT INTO `user_role` VALUES (8, '后勤部', '公司后勤支持与资产管理');
INSERT INTO `user_role` VALUES (9, '法务部', '法律咨询与合规管理');
INSERT INTO `user_role` VALUES (10, '战略部', '企业战略规划与发展');
表二
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`registered_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`role_id` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username` ASC) USING BTREE,
UNIQUE INDEX `email`(`email` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (3, 'user1', 'password123', 'user1@example.com', '2024-07-03 14:30:00', 1);
INSERT INTO `user` VALUES (4, 'editor', 'editpass123', 'editor@example.net', '2024-07-03 15:05:45', 3);
INSERT INTO `user` VALUES (5, 'moderator', 'modpass789', 'moderator@example.org', '2024-07-04 11:17:23', 4);
INSERT INTO `user` VALUES (6, 'testuser', 'test1234', 'testuser@example.io', '2024-07-05 10:00:00', 1);
INSERT INTO `user` VALUES (7, 'guest', 'guest123', 'guest@example.info', '2024-07-06 13:30:00', 1);
INSERT INTO `user` VALUES (8, 'poweruser', 'powerpass987', 'poweruser@example.biz', '2024-07-07 12:45:00', 2);
INSERT INTO `user` VALUES (9, 'developer', 'devpass456', 'developer@example.dev', '2024-07-08 11:20:30', 3);
INSERT INTO `user` VALUES (10, 'analyst', 'analyzepass', 'analyst@example.data', '2024-07-09 10:15:00', 4);
INSERT INTO `user` VALUES (15, 'zhangsan', '123456', '45562154@qq.com', '2024-07-02 18:05:50', 3);
INSERT INTO `user` VALUES (19, '李四', '123456', 'zhangsan1@example.com', '2024-07-13 07:16:00', 3);
SET FOREIGN_KEY_CHECKS = 1;
①参数传递的四种情况
普通参数
可以任意使用,不用考虑数据类型,和参数名【写sql时需要保持与传入参数保持一致】
多个普通参数
底层会将传入的参数封装到map结合中,key为param1、param2....【支持:arg0、arg1、...】调用的时候可以直接使用key进行sql传参
命名参数
在写maper函数声明的时候,使用注解 @Param(value = "自定义名称"),用法有可以直接将自定义名称写入,如@Param("自定义名称")
POJO参数
-
Mybatis支持POJO【JavaBean】入参,参数key是POJO中属性
②传参安全问题(#与$区别)
【#】底层执行SQL语句的对象,使用PreparedStatementd,预编译SQL,防止SQL注入安全隐患,相对比较安全。
【$】底层执行SQL语句的对象使用Statement对象,未解决SQL注入安全隐患,相对不安全。
# 在sql中可以使用占位符的位置都可以使用,直白一点就是传入的参数只能一般参数。比如表名就不能使用 # 作为占位符。
$在不考虑安全的情况下,基本什么地方都可以使用。一般使用的比较多的就是传入表名进行查询。
③查询结果返回的四种情况
查询单行数据返回一个对象
使用普通对象接收就行,会自动进行属性的映射赋值,resultType属性是对象
查询多行数据返回多个对象
使用集合容器装多个User对象,使用泛型指定对象类型可以减少我们犯低级错误的可能。resultType属性值集合中的对象类型。
查询单行数据返回Map集合
-
Map<String key,Object value>
-
字段作为Map的key,查询结果作为Map的Value
-
查询多行数据返回Map集合
-
Map<Integer key,Employee value>
-
对象的id作为key
-
对象作为value
-
注意:一般没有特殊情况,基本不会去指定参数类型,因为mybatis会自动识别,写的话会容易出现错误。
④Mybatis中自动映射与自定义映射
自动映射【resultType】
自定义映射【resultMap】
-
自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射
-
自动映射解决不了两类问题
-
多表连接查询时,需要返回多张表的结果集
-
单表查询时,不支持驼峰式自动映射【不想为字段定义别名】
-
-
-
自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射
-
注意:resultType与resultMap只能同时使用一个
<!--使用resultMap-->
<resultMap id="userAndRole" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
<result column="registered_date" property="registeredDate"/>
<result column="role_id" property="roleId"/>
<association property="role" javaType="Role">
<id column="role_id" property="roleID"/>
<result column="role_name" property="roleName"/>
</association>
</resultMap>
<select id="getUsersAndRoles" resultMap="userAndRole">
SELECT id, username, password, email, registered_date, role_id
FROM user
WHERE id = #{id}
</select>
4.分步查询
当需要对两张表或多张表进行查询时,联表查询的性能可能会较低,但可以通过分别查询每张表最后进行结果返回达到必要需求。
-
将多表连接查询,改为【分步单表查询】,从而提高程序运行效率
通过先查用户id,再通过部门id查全部
①association(关联一对一)
-
association标签:定义一对一的关联关系
-
property:定义关联关系属性
-
javaType:定义关联关系属性的类型
-
select:设置分步查询SQL全路径
-
colunm:设置分步查询SQL中需要参数
-
fetchType:设置局部延迟加载【懒加载】是否开启
-
具体操作就是通过其他mapper定义的查询方法,再将查询出来的结果作为下一个方法的查询参数。
②collection(关联一对多)
-
collection标签:定义一对多的关联关系
-
property:定义一对一关联关系属性
-
ofType:定义一对一关联关系属性类型
-
fetchType:设置局部延迟加载【懒加载】是否开启
-
实现的逻辑基本是和association一致,只是使用到的映射是collection标签实现的一对多。
5.动态sql
①常用的标签及其属性
-
if标签:用于完成简单的判断
-
where标签:用于解决where关键字及where后第一个and或or的问题
-
trim标签: 可以在条件判断完的SQL语句前后添加或者去掉指定的字符
-
prefix: 添加前缀
-
prefixOverrides: 去掉前缀
-
suffix: 添加后缀
-
suffixOverrides: 去掉后缀
-
-
set标签:主要用于解决set关键字及多出一个【,】问题
-
choose标签:类似java中if-else【switch-case】结构
-
foreach标签:类似java中for循环
-
collection: 要迭代的集合
-
item: 当前从集合中迭代出的元素
-
separator: 元素与元素之间的分隔符
-
open: 开始字符
-
close:结束字符
-
-
sql标签:提取可重用SQL片段
②应用场景与实例
动态SQL在实际开发中有许多使用场景,下面列举了一些常见的情况(原文链接):
查询条件的灵活组合:当用户的查询条件不固定,可能包含多个条件,并且这些条件之间的关系也可能是与、或、非等复杂组合时,使用动态SQL可以根据不同的查询条件生成不同的SQL语句,从而实现灵活的查询功能。
<select id="selectUser" resultType="User">
select
id,
username,
password,
email,
role_id,
registered_date
from
user
where
1=1
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
<if test="roleId != null and roleId != ''">
and role_id = #{roleId}
</if>
</select>
where语句后面加一个“1=1”是防止没有传入参数时发生查询异常而不能实现无筛选条件查询。<where>提供了更好的解决方案。
动态排序:当用户需要根据不同的字段和排序方式对查询结果进行排序时,可以使用动态SQL生成不同的排序条件,从而实现动态排序功能。
动态更新:当用户只修改了某些字段的值,而其他字段的值保持不变时,可以使用动态SQL生成只更新修改的字段的更新语句,从而减少不必要的数据库更新操作。
动态插入:当实体对象中的某些属性值为null时,可以使用动态SQL生成只插入非空属性的插入语句,从而避免在数据库中插入空值。
多表关联查询:当需要进行多表关联查询时,可以使用动态SQL生成包含多个表的JOIN语句,从而实现复杂的查询逻辑。
分页查询:在进行分页查询时,可以使用动态SQL生成不同的LIMIT或者ROWNUM等分页语句,从而实现分页功能。
动态删除:当需要根据不同的条件删除数据时,可以使用动态SQL生成不同的删除条件,从而实现灵活的删除操作。
6.Mybatis动态缓存机制
使用缓存的优势,可以提高查询的效率,还可以降低服务器的压力。缓存有三种类型,一级缓存,二级缓存,三级缓存(三方缓存)
①一级缓存
-
概述:一级缓存【本地缓存(Local Cache)或SqlSession级别缓存】
-
特点
-
一级缓存默认开启
-
不能关闭
-
可以清空
-
-
缓存原理
-
第一次获取数据时,先从数据库中加载数据,将数据缓存至Mybatis一级缓存中【缓存底层实现原理Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数】
-
以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据。
-
-
一级缓存五种失效情况
-
不同的SqlSession对应不同的一级缓存
-
同一个SqlSession但是查询条件不同
-
同一个SqlSession两次查询期间执行了任何一次增删改操作
-
清空一级缓存
-
同一个SqlSession两次查询期间手动清空了缓存
-
sqlSession.clearCache()
-
同一个SqlSession两次查询期间提交了事务
-
sqlSession.commit()
-
②二级缓存
-
二级缓存【second level cache】概述
-
二级缓存【全局作用域缓存】
-
SqlSessionFactory级别缓存
-
-
二级缓存特点
-
二级缓存默认关闭,需要开启才能使用
-
二级缓存需要提交sqlSession或关闭sqlSession时,才会缓存。
-
-
二级缓存使用的步骤:
① 全局配置文件中开启二级缓存<setting name="cacheEnabled" value="true"/>
② 需要使用二级缓存的映射文件处使用cache配置缓存<cache />
③ 注意:POJO需要实现Serializable接口
④关闭sqlSession或提交sqlSession时,将数据缓存到二级缓存
③三级缓存
-
第三方缓存:EhCache
-
EhCache 是一个纯Java的进程内缓存框架
使用方法
- 导入jar包
<!-- mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.3</version>
</dependency>
<!-- slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
- 编写配置文件【ehcache.xml】
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 磁盘保存路径 -->
<diskStore path="E:\mybatis\ehcache" />
<defaultCache
maxElementsInMemory="512"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
-
-
加载第三方缓存【映射文件】
-
开始使用
-
-
注意事项
-
第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】
-
如何让第三方缓存失效【将二级缓存设置失效即可】
-