网站首页 > 技术文章 正文
自动填充字段
基本概念
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、请注意,该插件可能会带来性能损耗,不建议在生产环境中使用。
猜你喜欢
- 2025-07-27 MyBatis批量插入的3种方案对比,速度差10倍!
- 2025-07-27 [JPA教程]02.认识JPA的注解.md(jpa的@query注解)
- 2025-07-27 MyBatis配置详解:从入门到精通(mybatis配置文件详解)
- 2025-07-27 什么是实时数据同步?纯干货解读!(什么是实时数据传输)
- 2025-07-27 Mybatis Plus框架学习指南-第八节内容(常用的注解)
- 2024-10-27 一文看懂mycat配置--数据库的读写分离、分表分库
- 2024-10-27 基于Percona XtraBackup 实现全备&增量备份与恢复
- 2024-10-27 Java EE核心框架实战:如何使用MyBatis实现CURD-2种数据库
- 2024-10-27 mysql如何进行累加计算 mysql 变量累加
- 2024-10-27 Springboot集成Mybatis ID生成策略注解 @GeneratedValue
你 发表评论:
欢迎- 633℃几个Oracle空值处理函数 oracle处理null值的函数
- 626℃Oracle分析函数之Lag和Lead()使用
- 614℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 608℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 606℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 599℃【数据统计分析】详解Oracle分组函数之CUBE
- 588℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 574℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- CVE-2025-30762|Oracle(java oracle)
- 低代码可能铲不掉“屎山”,但能让这个它更有「型」
- 科技大事件:新苹果手表可通过击掌或握手来传递信息
- 你的百万级上下文窗口大模型,可能并没有你想象中那么强
- DApp 开发中的安全测试(软件测试过程中安全测试的具体应用场景和测试思路)
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
- 机房硬件设备及Oracle数据库软件维护服务项目竞争性磋商公告
- 微软与甲骨文扩大合作关系,推出Oracle Database@Azure
- JPA实体类注解,看这篇就全会了(java实体类注解)
- Java反射机制最全详解(图文全面总结)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)