Mybatis Plus框架学习指南-第三节内容
ztj100 2025-08-05 22:25 4 浏览 0 评论
自动填充字段
基本概念
MyBatis-Plus 提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。
原理
自动填充功能通过实现
com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 接口来实现。你需要创建一个类来实现这个接口,并在其中定义插入和更新时的填充逻辑。
使用步骤
1、定义实体类
在实体类中,你需要使用 @TableField 注解来标记哪些字段需要自动填充,并指定填充的策略。
2、实现 MetaObjectHandler接口
创建一个类来实现 MetaObjectHandler 接口,并重写 insertFill 和 updateFill 方法。
3、配置自动填充处理器
确保你的 MyMetaObjectHandler 类被 Spring 管理,可以通过 @Component 或 @Bean 注解来实现。
注意事项
1、自动填充是直接给实体类的属性设置值。
2、如果属性没有值,入库时会是 null。
3、MetaObjectHandler 提供的默认方法策略是:如果属性有值则不覆盖,如果填充值为 null 则不填充。
4、字段必须声明 @TableField 注解,并设置 fill 属性来选择填充策略。
5、填充处理器需要在 Spring Boot 中声明为 @Component 或 @Bean。
6、使用 strictInsertFill 或 strictUpdateFill 方法可以根据注解 FieldFill.xxx、字段名和字段类型来区分填充逻辑。
7、如果不需区分,可以使用 fillStrategy 方法。
8、在 update(T entity, Wrapper<T> updateWrapper) 时,entity 不能为空,否则自动填充失效。
9、在 update(Wrapper<T> updateWrapper) 时不会自动填充,需要手动赋值字段条件。
主键策略
基本说明
主键生成策略必须使用 INPUT,内置支持:
1、DB2KeyGenerator
2、H2KeyGenerator
3、KingbaseKeyGenerator
4、OracleKeyGenerator
5、PostgreKeyGenerator
如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展。
示例
下面是一个使用 @KeySequence 注解的实体类示例
在这个示例中,YourEntity 类使用了 @KeySequence 注解来指定 Oracle 数据库中的序列 SEQ_ORACLE_STRING_KEY 来生成主键值,主键类型为 String。
Springboot整合
方法一:使用配置类
方法二:通过 MybatisPlusPropertiesCustomizer 自定义
自定义ID生成器
基本概念
MyBatis-Plus 提供了灵活的自定义ID生成器功能,允许开发者根据业务需求定制ID生成策略。从3.3.0版本开始,默认使用雪花算法结合不含中划线的UUID作为ID生成方式。
MyBatis-Plus自带主键生成策略对比
如何自定义
Spring Boot 集成
方式一:声明为Bean供Spring扫描注入
方式二:使用配置类
方式三:通过MybatisPlusPropertiesCustomizer自定义
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
return plusProperties -> plusProperties.getGlobalConfig().setIdentifierGenerator(new CustomIdGenerator());
}
与KeyGenerator的差异
MyBatis-Plus的IdentifierGenerator主要用于生成数据库表的主键ID,而KeyGenerator是MyBatis框架中的一个接口,用于在执行SQL语句时生成键值,通常用于生成自增主键或者在执行INSERT语句后获取新生成的ID。
IdentifierGenerator更加专注于主键ID的生成,而KeyGenerator则更加通用,可以用于多种键值生成场景。在使用MyBatis-Plus时,通常推荐使用IdentifierGenerator来生成主键ID,因为它与MyBatis-Plus的集成更加紧密,提供了更多的便利性和功能。
逻辑删除支持
基本概念
逻辑删除是一种优雅的数据管理策略,它通过在数据库中标记记录为“已删除”而非物理删除,来保留数据的历史痕迹,同时确保查询结果的整洁性。
工作原理
MyBatis-Plus 的逻辑删除功能会在执行数据库操作时自动处理逻辑删除字段。以下是它的工作方式:
插入:逻辑删除字段的值不受限制。
查找:自动添加条件,过滤掉标记为已删除的记录。
更新:防止更新已删除的记录。
删除:将删除操作转换为更新操作,标记记录为已删除。
例如:
删除:update user set deleted=1 where id = 1 and deleted=0
查找:select id,name,deleted from user where deleted=0
支持的数据类型
逻辑删除字段支持所有数据类型,但推荐使用 Integer、Boolean 或 LocalDateTime。 如果使用 datetime 类型,可以配置逻辑未删除值为 null(长度为4的字符串,在yaml中需使用转义符(单引号)包裹),已删除值可以使用函数如 now() 来获取当前时间。 如果使用 bigint 类型,可以配置逻辑未删除值为 0,已删除值可以使用函数如 UNIX_TIMESTAMP() 来获取当前时间戳作为删除标识。适合用于将删除字段作为唯一索引组成列,可以多次逻辑删除
使用方法
1、配置全局逻辑删除属性
在 application.yml 中配置 MyBatis-Plus 的全局逻辑删除属性。
2、在实体类中使用 @TableLogic 注解
在实体类中,对应数据库表的逻辑删除字段上添加 @TableLogic 注解
注意事项
1、逻辑删除的本质:逻辑删除的效果应等同于物理删除,其目的是为了保留数据,实现数据价值最大化。
2、业务需求考量:如果业务中仍需频繁查询这些“已删除”的数据,应考虑是否真正需要逻辑删除。或许,一个状态字段来控制数据的可见性更为合适。
多数据源支持
基本概念
随着项目规模的扩大,单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。
dynamic-datasource
基本概念
dynamic-datasource 是一个开源的 Spring Boot 多数据源启动器,提供了丰富的功能,包括数据源分组、敏感信息加密、独立初始化表结构等。
特性
1、数据源分组:适用于多种场景,如读写分离、一主多从等。
2、敏感信息加密:使用ENC()加密数据库配置信息。
3、独立初始化:支持每个数据库独立初始化表结构和数据库。
4、自定义注解:支持自定义注解,需继承DS。
5、简化集成:提供对Druid、HikariCP 等连接池的快速集成。
6、组件集成:支持 Mybatis-Plus、Quartz 等组件的集成方案。
7、动态数据源:支持项目启动后动态增加或移除数据源。
8、分布式事务:提供基于 Seata 的分布式事务方案。
约定
1、本框架专注于数据源切换,不限制具体操作。
2、配置文件中以下划线 _ 分割的数据源首部为组名。
3、切换数据源可以是组名或具体数据源名
4、默认数据源名为 master,可通过
spring.datasource.dynamic.primary 修改
5、方法上的注解优先于类上的注解
使用方法
1、引入依赖
2、配置数据源
3、使用 @DS 切换数据源
SQL分析与打印
基本概念
MyBatis-Plus提供了SQL分析与打印的功能,通过集成p6spy组件,可以方便地输出SQL语句及其执行时长。本功能适用于MyBatis-Plus 3.1.0及以上版本。
p6spy
基本介绍
p6spy 是一个针对数据库访问进行拦截和记录的工具,它通过代理JDBC驱动程序来工作。这意味着你的应用程序可以像往常一样使用JDBC,而p6spy会在幕后记录所有的SQL语句及其执行时间。这对于开发和调试过程中的SQL优化非常有用。
高级功能
p6spy不仅限于记录SQL日志,它还提供了一些高级功能,如:
慢SQL检测
通过配置outagedetection和outagedetectioninterval,p6spy可以记录执行时间超过设定阈值的SQL语句。
自定义日志格式
通过logMessageFormat,你可以自定义SQL日志的输出格式,包括时间戳、执行时间、SQL语句等。
日志输出控制
appender配置项允许你选择日志输出到控制台、文件或日志系统。
p6spy是一个强大的工具,它为MyBatis-Plus用户提供了便捷的SQL分析与打印功能。通过合理配置,你可以在开发和测试阶段有效地监控和优化SQL语句。然而,由于性能损耗,建议在生产环境中谨慎使用。
使用方法
1、依赖引入
首先,需要在项目中引入p6spy依赖
2、配置
需要在application.yml或application.properties中进行相应的配置
application.yml
配置spy.properties文件
p6spy的配置文件spy.properties包含了多个配置项,以下是一些关键配置的示例
springboot集成
对于Spring Boot项目,可以使用p6spy-spring-boot-starter来简化集成过程
添加依赖
配置
注意事项
1、driver-class-name应配置为p6spy提供的驱动类。
2、url前缀应为jdbc:p6spy,后跟实际的数据库连接地址
3、如果打印的SQL为null,请在excludecategories中增加commit
4、如果批量操作不打印SQL,请去除excludecategories中的batch。
5、对于批量操作打印重复的问题,请使用MybatisPlusLogFactory(3.2.1新增)
6、请注意,该插件可能会带来性能损耗,不建议在生产环境中使用。
相关推荐
- 作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?
-
在互联网大厂后端开发领域,MyBatis作为一款主流的持久层框架,凭借其灵活的配置与强大的数据处理能力,广泛应用于各类项目之中。然而,随着业务场景日趋复杂、系统规模不断扩张,开发过程中常面临SQL...
- 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)
-
前言zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板-基础框架-分布式架构-开源项目-持续集成-自动化部署-系统监测-无缝升级的全方位J2EE企业级开发解...
- 基于Java实现,支持在线发布API接口读取数据库,有哪些工具?
-
基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...
- Mybatis Plus框架学习指南-第三节内容
-
自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理...
- 被你误删了的代码,在 IntelliJ IDEA中怎么被恢复
-
在IntelliJIDEA中一不小心将你本地代码给覆盖了,这个时候,你ctrl+z无效的时候,是不是有点小激动?我今天在用插件mybatisgenerator自动生成mapper的时候,...
- 修改 mybatis-generator 中数据库类型和 Java 类型的映射关系
-
使用mybatis-generator发现数据库类型是tinyint(4),生成model时字段类型是Byte,使用的时候有点不便数据库的类型和Model中Java类型的关系...
- 又被问到了, java 面试题:反射的实现原理及用途?
-
一、反射的实现原理反射(Reflection)是Java在运行时动态获取类的元数据(如方法、字段、构造器等)并操作类对象的能力。其核心依赖于...
- Spring Boot 中JPA和MyBatis技术那个更好?
-
你在进行SpringBoot项目开发时,是不是也经常在选择JPA和MyBatis这两个持久化技术上犯难?面对众多前辈的经验之谈,却始终拿不准哪种技术才最适合自己的项目?别担心,今天咱们就...
- Spring Boot (七)MyBatis代码自动生成和辅助插件
-
一、简介1.1MyBatisGenerator介绍MyBatisGenerator是MyBatis官方出品的一款,用来自动生成MyBatis的mapper、dao、entity的框架,让...
- 解决MyBatis Generator自动生成.java.1文件
-
MyBatis框架操作数据库,一张表对应着一个实体类、一个Mapper接口文件、一个Mapper映射文件。一个工程项目通常最少也要几十张表,那工作量可想而知非常巨大的,MyBatis框架替我们想好了解...
- Linux yq 命令使用详解
-
简介yq是一个轻量级、可移植的命令行...
- Python学不会来打我(62) json数据操作汇总
-
很多小伙伴学了很久的python一直还是没有把数据类型之间的转换搞明白,上一篇文章我们详细分享了python的列表、元组、字典、集合之间的相互转换,这一篇文章我们来分享json数据相关的操作,虽然严格...
- 之前3W买的Python全系列教程完整版(懂中文就能学会)
-
今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版!言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔...
- x-cmd pkg | grex - 正则表达式生成利器,解决手动编写的烦恼
-
简介grex是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是DevonGovett编写的JavaScript工具regexgen的Rust移植。但re...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?
- 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)
- 基于Java实现,支持在线发布API接口读取数据库,有哪些工具?
- Mybatis Plus框架学习指南-第三节内容
- 被你误删了的代码,在 IntelliJ IDEA中怎么被恢复
- 修改 mybatis-generator 中数据库类型和 Java 类型的映射关系
- 又被问到了, java 面试题:反射的实现原理及用途?
- Spring Boot 中JPA和MyBatis技术那个更好?
- Spring Boot (七)MyBatis代码自动生成和辅助插件
- 解决MyBatis Generator自动生成.java.1文件
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)