SpringCloud-持久层框架MyBatis Plus的使用与原理详解
在现代微服务架构中,SpringCloud 是一个非常流行的解决方案。而在数据库操作层面,MyBatis Plus 作为 MyBatis 的增强工具,能够简化开发,提升效率,特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBatis Plus 的使用方法、原理及其与 MyBatis 的区别。
一、MyBatis Plus 简介
1. MyBatis 简介
MyBatis 是一个优秀的 ORM 框架,它通过 XML 或注解的方式将 Java 方法与 SQL 语句进行映射,并且可以灵活地控制 SQL 执行的各个细节,提供极高的自由度。它广泛应用于项目中,尤其是在对 SQL 语句要求比较严格的场景中。
2. MyBatis Plus 介绍
MyBatis Plus 是在 MyBatis 的基础上进行增强的持久层框架,专注于简化 MyBatis 的开发工作。它封装了常用的 CRUD 操作,极大地减少了开发者编写 SQL 的工作量。其目标是“更少的配置,更多的功能”,通过插件机制提供更强大的功能扩展。
3. MyBatis 与 MyBatis Plus 的对比
对比项 | MyBatis | MyBatis Plus |
---|---|---|
核心理念 | 手写 SQL,灵活但需要大量的 SQL 代码 | 自动化 CRUD,大大减少手写 SQL |
SQL 编写 | 需要手动编写所有 SQL 语句 | 提供默认 CRUD 接口,只需少量自定义 SQL |
复杂查询 | 需要手动编写复杂 SQL 语句 | 提供条件构造器,简化复杂查询操作 |
分页 | 需要手动编写分页逻辑 | 内置分页插件,简化分页操作 |
性能优化 | 自定义 SQL 性能优化较灵活 | 提供多种插件支持性能优化,如 SQL 执行分析插件 |
代码生成 | 不支持代码生成 | 提供自动代码生成器,支持一键生成 Mapper、Service 等 |
扩展能力 | 通过配置扩展 | 内置多种插件机制,支持扩展,如乐观锁、审计等 |
通过这张对比表可以看出,MyBatis Plus 在开发效率和功能扩展上具有显著优势,尤其在企业级开发中,可以大大简化数据库操作的工作。
二、MyBatis Plus 的基本使用
1. 基础依赖和配置
要在 SpringCloud 中使用 MyBatis Plus,首先需要在项目的 pom.xml
中添加 MyBatis Plus 的依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version>
</dependency>
接下来,在 application.yml
中配置数据库连接:
spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useSSL=falseusername: rootpassword: your_passwordmybatis-plus:mapper-locations: classpath:/mapper/*.xml
2. 实体类的定义
在 MyBatis Plus 中,实体类是映射数据库表的核心。在实体类中,常用 @TableName
和 @TableId
注解来映射表和主键。
@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;
}
3. Mapper 接口的编写
Mapper 接口是 MyBatis Plus 提供的基础 CRUD 接口,继承 BaseMapper
就可以拥有常用的 CRUD 功能,无需额外编写 SQL。
public interface UserMapper extends BaseMapper<User> {
}
4. Service 层的实现
为了更好地管理业务逻辑,通常会在 Service 层中编写业务方法。可以通过注入 Mapper 来实现对数据库的操作。
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.selectList(null);}public void createUser(User user) {userMapper.insert(user);}
}
三、MyBatis Plus 的高级用法
1. 分页插件
分页是大多数系统必备的功能。MyBatis Plus 内置分页插件,可以通过简单的配置实现高效分页。
@Autowired
private UserMapper userMapper;public IPage<User> getUsersPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectPage(page, null);
}
2. 乐观锁插件
MyBatis Plus 支持乐观锁,防止多个用户同时修改同一条数据时的并发问题。可以通过在实体类上添加 @Version
注解来启用乐观锁功能。
@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@Versionprivate Integer version; // 乐观锁版本字段
}
3. 多租户插件
MyBatis Plus 提供了多租户插件,支持在多租户架构中为每个租户分配独立的数据空间,避免数据泄露或冲突。
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 多租户插件配置TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor();interceptor.addInnerInterceptor(tenantLineInnerInterceptor);return interceptor;}
}
4. 自动填充功能
MyBatis Plus 支持自动填充常见字段,如创建时间、更新时间等。可以通过 @TableField
注解配置字段的自动填充策略。
@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableField(fill = FieldFill.INSERT)private Date createTime; // 自动填充创建时间@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime; // 自动填充更新时间
}
5. 逻辑删除功能
逻辑删除是一种不物理删除数据,而是通过标记删除状态的方式实现删除。MyBatis Plus 提供了逻辑删除支持,可以通过 @TableLogic
注解实现。
@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableLogicprivate Integer deleted; // 逻辑删除字段
}
四、MyBatis Plus 原理详解
MyBatis Plus 的原理是基于 MyBatis 的核心功能进行增强,主要通过 插件机制 和 代码生成机制 提供额外的功能支持。
1. 基于 MyBatis 核心的增强
MyBatis Plus 是对 MyBatis 的扩展和增强,在 MyBatis 的基础上引入了大量的插件和自定义功能。例如,通过扩展 BaseMapper
,MyBatis Plus 为所有实体类提供了基础的 CRUD 功能,开发者无需编写重复的 SQL。
2. 插件机制
MyBatis Plus 的插件机制非常灵活,允许开发者自定义插件,扩展 MyBatis Plus 的功能。MyBatis Plus 通过 责任链模式 处理多个插件请求,插件之间通过 链式调用 实现功能的扩展。
常见的插件包括:
- 分页插件:通过在 SQL 执行前后进行拦截,实现分页功能。
- 多租户插件:通过在 SQL 中自动加入租户 ID 实现数据隔离。
- 乐观锁插件:通过在 SQL 中自动加入版本号实现并发控制。
3. 条件构造器
MyBatis Plus 提供了 条件构造器,简化了复杂 SQL 的拼装过程。条件构造器基于 Lambda 表达式,能够灵活构建动态查询条件,极大地简化了 SQL 的编写工作。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(User::getName, "Tom").ge(User::getAge, 18);
List<User> users = userMapper.selectList(queryWrapper);
4. 自动代码生成器
MyBatis Plus 提供了自动代码生成器,支持通过数据库表结构自动生成实体类、Mapper、Service、Controller 等层的代码,大幅减少手工编写代码的工作量。这一特性非常适合大型项目和快速迭代开发的场景。
5. 动态 SQL 解析
MyBatis Plus 支持动态 SQL 解析,通过注解或 XML 方式在运行时解析 SQL,生成最终的 SQL 语句。这种方式使得 SQL 编写更加灵活,能够适应复杂的业务逻辑。
五、MyBatis Plus 的使用总结
MyBatis Plus 在简化 MyBatis 开发工作、提升开发效率和灵活性方面表现出色。它不仅保留了 MyBatis 的强大 SQL 自定义功能,还通过插件机制和自动化工具提供了更多的扩展功能。
MyBatis Plus 的核心优势:
优势 | 说明 |
---|---|
自动化 CRUD | 通过内置的 CRUD 接口,减少了开发者手动编写 SQL 的工作量。 |
分页和多租户支持 | MyBatis Plus 内置分页和多租户插件,能够轻松处理复杂的查询场景。 |
性能优化 | 通过插件机制和缓存机制,MyBatis Plus 提供多种性能优化手段,保证高效的数据库操作。 |
代码生成器 | 自动生成常用代码,提升开发效率,加快项目开发速度。 |
总之,MyBatis Plus 是 SpringCloud 项目中非常优秀的持久层框架。通过其丰富的功能和灵活的扩展机制,可以大幅提升开发效率,特别适用于大规模分布式系统的开发。
相关文章:

SpringCloud-持久层框架MyBatis Plus的使用与原理详解
在现代微服务架构中,SpringCloud 是一个非常流行的解决方案。而在数据库操作层面,MyBatis Plus 作为 MyBatis 的增强工具,能够简化开发,提升效率,特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBat…...
Servlet的HttpServletRequest
HttpServletRequest是Java Servlet规范中定义的一个接口,它表示客户端向服务器发送的请求,并提供了与HTTP请求相关的方法和属性。 getSession方法():用于获取与当前请求相关联的HttpSession对象。 setAttribute(String name, Object value)…...

U9销售订单不能带出最新价格出来
业务员突然说系统带不出来销售价格。了解之后,不是带不出来价格,是做了价格调整之后,最新价格没有匹配出来,带出来的价格是历史价格。检查,分析相关的单据,生效日期,失效日期,审核状…...

Jmeter接口测试企业级项目实战day1
1.接口测试 接口测试工具: JMeter:支持多种接口类型,还能测试性能,开源,开源进行二次扩展。 Postman:简单,方便,局限性比较大,适合开发临时行调试 APIFox等:新…...

接口测试面试题含答案
1、解释一下正向和逆向测试。 正向测试:针对接口设计预期的功能和行为,验证接口是否按照预期工作。 逆向测试:针对错误输入、不合理的条件或非预期的使用方式,验证接口是否能够适当地处理这些情况并提供合理的错误处理。 2、什…...

横板营业执照提取生成
前言 有一段时间没发博客了,今天分享下几个月前做的营业执照提取器UI 预览图 框架 b-ui很好用,这个前端框架作者 发布的插件我都会用,鱿鱼助手也是基于这个框架开发的 代码 html <template><view><template><view…...

webm格式怎么转换成mp4?这5种转换方法很好用
现如今,视频格式繁多,而webm作为一种由谷歌开发的视频格式,以其高画质和低带宽需求著称。然而,并非所有设备和播放器都完美支持webm格式,这时将其转换为兼容性更强的MP4格式就显得尤为重要。下面给大家分享5种非常简单…...

C/C++语言基础--C++异常看这一篇就够了
本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 通过前面几节课,我们学习了抽象、封装、继承、多态等相关的概念,接下来我们将讲解异常,异常是专门处理错误的;这一次加了不少图标,希望大家喜欢;C语…...
DFT ATPG中常见影响coverage的因素有哪些?
# DFT ATPG中常见影响Coverage的因素 ## 一、电路结构复杂性 1. **逻辑层次深度** - **原理** - 当电路的逻辑层次很深时,信号在传播过程中会经过多个逻辑门的处理。这使得测试向量难以准确地控制和观察内部节点的状态。例如,在一个具有多层嵌套逻辑的电路中,如一个…...
Python机器学习数据清洗到特征工程策略
Python机器学习数据清洗到特征工程策略 目录 ✨ 数据清洗:处理缺失值与异常值的策略🔄 特征选择:筛选与数据目标高度相关的特征🛠 特征工程:数据转换与生成新特征的多样化方法📊 类别型变量的数值化&…...

多线程-进阶(2)CountDownLatchConcurrentHashMapSemaphore
目的; JUC(java.util.concurrent) 的常⻅类 接着上一节课到 1.信号量 Semaphore 信号量, ⽤来表⽰ "可⽤资源的个数". 本质上就是⼀个计数器。 理解信号量 可以把信号量想象成是停⻋场的展⽰牌: 当前有⻋位 100 个. 表⽰有 100 个可⽤资源. 当有⻋开进去的时候,…...

密码管理器KeePass的安装及使用
文章目录 软件下载安装汉化新建数据库创建\移动\修改 群组添加/修改/删除/移动 记录展示、搜索、锁定单独使用keepass生成密码的功能AES-256的密钥长度为256位,为啥可以设置超过32个字符的密钥? 软件下载 安装 分别解压:KeePass-2.53.1.zip&…...

星海智算:【萤火遛AI-Stable-Diffusion】无需部署一键启动
部署流程 1、注册算力云平台:星海智算 https://gpu.spacehpc.com/ 2、创建实例,镜像请依次点击:“镜像市场”->“更换”->“AI绘画”->“萤火遛AI-Stable Diffusion”。 程序首次启动可能需要几分钟,待实例显示“运行…...
JS生成器的特殊用法:委托yield*
yield 的基本用法 yield 用于在生成器函数中暂停函数执行,并返回一个值给外部调用者。当生成器再次被调用时,会从暂停的地方继续执行。 示例: function* simpleGenerator() {yield 1;yield 2;yield 3; }const gen simpleGenerator();cons…...
【CuPy报错】NVRTC_ERROR_COMPILATION (6)找不到 ‘vector_types.h‘
cupy安装不要再使用pip install cupy了, 已经替换成基于版本安装了pip install cupy-cuda12x,详见cupy官网。 安装完成后,在import cupy之后报错,找不到 ‘vector_types.h’: CompileException: /home/zoe/venv/lib/python3.10/…...

机器学习:知识蒸馏(Knowledge Distillation,KD)
知识蒸馏(Knowledge Distillation,KD)作为深度学习领域中的一种模型压缩技术,主要用于将大规模、复杂的神经网络模型(即教师模型)压缩为较小的、轻量化的模型(即学生模型)。在实际应…...

【C++入门篇 - 3】:从C到C++第二篇
文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意:在C语言中,如果内存不够…...

YOLOv8模型改进 第七讲 一种新颖的注意力机制 Outlook Attention
随着目标检测技术的不断发展,YOLOv8 作为最新一代的目标检测模型,已经在多个基准数据集上展现了其卓越的性能。然而,在复杂场景中,如何进一步提升模型的检测精度和鲁棒性依然是一个重要挑战。本文将探讨将 Outlook Attention 机制…...

C#多线程基本使用和探讨
线程是并发编程的基础概念之一。在现代应用程序中,我们通常需要执行多个任务并行处理,以提高性能。C# 提供了多种并发编程工具,如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类࿰…...
PHP DateTime基础用法
PHP DateTime 的用法详解 一、引言 在开发 PHP 应用程序时,处理日期和时间是一个至关重要的任务。PHP 提供了强大的日期和时间处理功能,其中 DateTime 类是最常用的工具之一。DateTime 类提供了丰富的方法来创建、格式化、计算和比较日期时间ÿ…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...