Mybatis框架入门

1.Mybatis简介

官方文档:mybatis – MyBatis 3 | Introductionicon-default.png?t=N7T8https://mybatis.org/mybatis-3/

源代码地址:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for JavaMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/mybatis/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查询语句+参数】

    • 以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据。

  • 一级缓存五种失效情况

    1. 不同的SqlSession对应不同的一级缓存

    2. 同一个SqlSession但是查询条件不同

    3. 同一个SqlSession两次查询期间执行了任何一次增删改操作

    • 清空一级缓存

    1. 同一个SqlSession两次查询期间手动清空了缓存

    • sqlSession.clearCache()

    1. 同一个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>
    • 加载第三方缓存【映射文件】

    • 开始使用

  • 注意事项

    • 第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】

    • 如何让第三方缓存失效【将二级缓存设置失效即可】

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@小虎同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值