使用MyBatis缓存的简单案例

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MyBatis 是一种流行的持久层框架,支持自定义 SQL 执行、映射及复杂查询。本文介绍了如何在 Spring Boot 项目中集成 MyBatis 并实现一级和二级缓存,以提高查询性能,减少数据库访问。通过具体的电商系统案例,详细讲解了项目搭建、缓存配置、实体类创建、Mapper 编写、Service 层实现及缓存测试等步骤。

MyBatis 是一种流行的持久层框架,支持 SQL 的自定义执行、映射以及复杂查询。MyBatis 提供了两级缓存机制:一级缓存和二级缓存。一级缓存是基于 SqlSession 的缓存,而二级缓存则是跨 SqlSession 的缓存。使用缓存可以大大提高查询的性能,因为重复的查询不会每次都访问数据库,而是从缓存中获取结果。

场景案例

假设我们有一个电商系统,其中有一个用户表 users,每次请求需要获取用户的信息。为了减少数据库访问,我们可以通过 MyBatis 的缓存机制来缓存用户数据,特别是那些频繁访问且变化不频繁的用户信息。

步骤 1:项目环境搭建

在 Spring Boot 中集成 MyBatis 和缓存,可以通过配置 mybatis-spring-boot-starter 来实现。

1.1 添加依赖

pom.xml 中添加 MyBatis 和 Spring Boot 的依赖:

xml

代码解读

复制代码

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis Spring Boot Starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok (Optional for simplicity) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

1.2 配置数据库连接

application.yml 中配置 MySQL 数据库连接信息:

yaml

代码解读

复制代码

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_cache_db
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.example.mybatiscache.model
    configuration:
      cache-enabled: true # 启用 MyBatis 二级缓存

1.3 创建数据库表

sql

代码解读

复制代码

CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

步骤 2:实现缓存机制

2.1 创建实体类

User.java

java

代码解读

复制代码

package com.example.mybatiscache.model;

import lombok.Data;
import java.sql.Timestamp;

@Data
public class User {
    private Long id;
    private String name;
    private String email;
    private Timestamp createdAt;
}

2.2 编写 Mapper 接口

UserMapper.java

java

代码解读

复制代码

package com.example.mybatiscache.mapper;

import com.example.mybatiscache.model.User;
import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
}

2.3 编写 Mapper XML 文件

mapper/UserMapper.xml

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

  <!-- 开启二级缓存 -->
  <cache/>

  <select id="getUserById" parameterType="long" resultType="com.example.mybatiscache.model.User">
    SELECT * FROM users WHERE id = #{id}
  </select>

</mapper>

2.4 编写 Service 层

UserService.java

java

代码解读

复制代码

package com.example.mybatiscache.service;

import com.example.mybatiscache.mapper.UserMapper;
import com.example.mybatiscache.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    @Transactional
    public void addUser(User user) {
        userMapper.insertUser(user);
    }
}

步骤 3:测试缓存机制

3.1 编写控制器

UserController.java

java

代码解读

复制代码

package com.example.mybatiscache.controller;

import com.example.mybatiscache.model.User;
import com.example.mybatiscache.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping("/")
    public User createUser(@RequestBody User user) {
        userService.addUser(user);
        return user;
    }
}

3.2 验证缓存效果

  1. 启动 Spring Boot 项目。
  2. 通过 Postman 或 Curl 插入新用户:

bash

代码解读

复制代码

curl -X POST http://localhost:8080/users/ \
  -H "Content-Type: application/json" \
  -d '{"name": "John", "email": "john@example.com"}'
  1. 获取用户信息:

bash

代码解读

复制代码

curl http://localhost:8080/users/1
  1. 多次执行相同的 GET 请求,观察控制台日志,可以看到相同的 SQL 语句只执行一次,这说明第二次获取时是从缓存中获取数据的。

步骤 4:MyBatis 缓存机制原理

  • 一级缓存:MyBatis 的一级缓存是 SqlSession 级别的缓存。在同一个 SqlSession 中,相同的查询结果会缓存起来,再次执行时,直接从缓存中获取,避免重复访问数据库。一级缓存是默认开启的,且作用范围是 SqlSession
  • 二级缓存:MyBatis 提供了跨 SqlSession 的二级缓存,作用范围是 Mapper。二级缓存需要在 MyBatis 的 XML 文件中配置 <cache/> 来开启。MyBatis 会将查询结果缓存到内存中,之后的相同查询可以直接从缓存中返回结果,而不需要再次访问数据库。

缓存更新机制

  • 当执行 INSERTUPDATEDELETE 操作时,MyBatis 会自动清除相关的缓存,确保缓存数据和数据库数据保持一致。
  • 在上面的案例中,我们只要调用了 createUser 方法插入新用户,MyBatis 就会清除与用户相关的缓存数据,保证下次查询时获取到的是最新的数据。

总结

通过以上步骤,我们在一个简单的 Spring Boot 项目中集成了 MyBatis 的一级和二级缓存机制,并通过一个实际的场景案例展示了缓存的使用及其原理。这样,我们可以提高系统的查询性能,减少对数据库的频繁访问。


转载来源https://juejin.cn/post/7420272008146894874

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
存储 缓存 NoSQL
mybatisplus一二级缓存
MyBatis-Plus 继承并优化了 MyBatis 的一级与二级缓存机制。一级缓存默认开启,作用于 SqlSession,适用于单次会话内的重复查询;二级缓存需手动开启,跨 SqlSession 共享,适合提升多用户并发性能。支持集成 Redis 等外部存储,增强缓存能力。
|
9月前
|
缓存 Java 数据库连接
Mybatis一级缓存详解
Mybatis一级缓存为开发者提供跨数据库操作的一致性保证,有效减轻数据库负担,提高系统性能。在使用过程中,需要结合实际业务场景选择性地启用一级缓存,以充分发挥其优势。同时,开发者需注意其局限性,并做好事务和并发控制,以确保系统的稳定性和数据的一致性。
320 20
|
11月前
|
缓存 Java 数据库连接
Mybatis一级缓存、二级缓存详讲
本文介绍了MyBatis中的查询缓存机制,包括一级缓存和二级缓存。一级缓存基于同一个SqlSession对象,重复查询相同数据时可直接从缓存中获取,减少数据库访问。执行`commit`操作会清空SqlSession缓存。二级缓存作用于同一namespace下的Mapper对象,支持数据共享,需手动开启并实现序列化接口。二级缓存通过将数据存储到硬盘文件中实现持久化,为优化性能,通常在关闭Session时批量写入缓存。文章还说明了缓存的使用场景及注意事项。
422 7
Mybatis一级缓存、二级缓存详讲
|
12月前
|
缓存 Java 数据库连接
十、MyBatis的缓存
十、MyBatis的缓存
254 6
|
12月前
|
存储 数据挖掘 虚拟化
vsan数据恢复—vsan缓存盘故障导致虚拟机磁盘文件丢失的数据恢复案例
VMware vsan架构采用2+1模式。每台设备只有一个磁盘组(7+1),缓存盘的大小为240GB,容量盘的大小为1.2TB。 由于其中一台主机(0号组设备)的缓存盘出现故障,导致VMware虚拟化环境中搭建的2台虚拟机的磁盘文件(vmdk)丢失。
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
262 6
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
2142 6
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
517 4
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
267 1