百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Mybatis Plus框架学习指南-第三节内容

mhr18 2025-07-14 19:55 2 浏览 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、请注意,该插件可能会带来性能损耗,不建议在生产环境中使用

相关推荐

Spring Boot 分布式事务实现简单得超乎想象

环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

Qt编写可视化大屏电子看板系统15-曲线面积图

##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

「数据库」Sysbench 数据库压力测试工具

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

如何选择适合公司的ERP(选erp系统的经验之谈)

很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

Manus放开注册,但Flowith才是Agent领域真正的yyds

大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

为什么说Python是最伟大的语言?看图就知道了

来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

联合国岗位上新啦(联合国的岗位)

联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

oracle列转行以及C#执行语句时报错问题

oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

取消回复欢迎 发表评论: