【代码备忘录】Mybatis Plus自动填充技术

493 阅读3分钟

Mybatis Plus YYDS

絮絮叨叨

在开发过程中,经常会遇到一些需要在数据库表中自动写入特定字段值的情况,例如创建时间、更新时间等,这时候MybatisPlus的自动填充功能就派上用场了。在本文中,左羊将介绍MybatisPlus自动填充的技术原理以及如何在项目中使用。

首先,咱们需要了解自动填充是如何工作的。MybatisPlus通过MetaObject对象来实现对数据库表的字段进行自动填充。当咱们插入数据时,MybatisPlus会使用MetaObject对象检测实体中的特定字段,如果检测到有需要填充的字段,它就会根据特定的逻辑自动填充这些字段。

改改就能抄的代码

下面是一个示例代码,演示了如何使用MybatisPlus进行自动填充。在这个示例中,咱们将创建一个Hero实体,包括创建者、创建时间、更新者、更新时间等属性,然后使用MybatisPlus的自动填充功能为这些属性赋值。

实体类

@Data
@TableName("Hero")
public class Hero {
    @TableId(type=IdType.AUTO)
    private Long id;

    private String name;

    @TableField(fill = FieldFill.INSERT)
    private Long createBy;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.UPDATE)
    private Long updateBy;

    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}

Handler

public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createBy", Long::valueOf, "zuoyang");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateBy", Long::valueOf, "zuoyang");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

Config

@Configuration
@MapperScan("com.zuoyang.mapper")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // add PageInterceptor
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

    @Bean
    public MyMetaObjectHandler myMetaObjectHandler() {
        return new MyMetaObjectHandler();
    }

}

在这个示例中,咱们创建了一个User实体,其中包含了创建者、创建时间、更新者、更新时间等属性。咱们使用@TableField(fill = FieldFill.INSERT)@TableField(fill = FieldFill.UPDATE)注解来标记需要自动填充的属性。

接下来,咱们创建了一个名为MyMetaObjectHandler的对象,并实现了MetaObjectHandler接口,该对象将根据自定义逻辑为咱们的实体属性自动填充值。在这个示例中,咱们为createBy属性的初始值提供了一个默认值“zuoyang”,并使用LocalDateTime::now方法为createTimeupdateTime属性提供当前时间。

最后,咱们在配置类中注册了这个MyMetaObjectHandler对象。在进行数据库操作时,MybatisPlus会生成一个MetaObject对象并将这个对象传递到MyMetaObjectHandler中,MyMetaObjectHandler将根据实体属性需要自动填充的规则来自动填充这些属性。

@TableField用法

注解名称解释
@TableField(exist = false)标记这个属性并非数据库表中的字段,但实体类需要这个属性,例如在一些特殊逻辑中需要用到。
@TableField(value = "column_name")映射实体属性和数据库表中的字段名,value参数即为数据库表中的字段名。
@TableField(value = "column_name", el = "role.id")映射实体属性和一个 SQL 片段,用法类似于 XML 中的 占位符,其中el参数可写成{} 占位符,其中 el 参数可写成 {} 或 #{},这里的示例中将在 SQL 语句中使用 role.id 的值作为 column_name 的值。
@TableField(value = "column_name", condition = SqlCondition.LIKE)指定实体类基本的 SQL 操作中 WHERE 条件的运算符,默认情况下为 =,例如这个示例中是用 LIKE 运算符进行模糊查询。
@TableField(select = false)当进行查询操作时,标记这个字段不出现在 SQL 语句的 SELECT 字段中,同时 EntityWrapper 和 LambdaWrapper 会忽略这个字段。
@TableField(fill = FieldFill.INSERT)指定需要自动填充的字段,在 INSERT 操作时自动设置默认值或者填充当前时间。
@TableField(fill = FieldFill.UPDATE)指定需要自动填充的字段,在 UPDATE 操作时自动设置默认值或者填充当前时间。
@TableField(fill = FieldFill.INSERT_UPDATE)指定需要自动填充的字段,在 INSERT 或者 UPDATE 操作时自动设置默认值或者填充当前时间。

参考文献:

Mybatis Plus 官方文档 https://baomidou.com/