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方法为createTime和updateTime属性提供当前时间。
最后,咱们在配置类中注册了这个MyMetaObjectHandler对象。在进行数据库操作时,MybatisPlus会生成一个MetaObject对象并将这个对象传递到MyMetaObjectHandler中,MyMetaObjectHandler将根据实体属性需要自动填充的规则来自动填充这些属性。
@TableField用法
| 注解名称 | 解释 |
|---|---|
| @TableField(exist = false) | 标记这个属性并非数据库表中的字段,但实体类需要这个属性,例如在一些特殊逻辑中需要用到。 |
| @TableField(value = "column_name") | 映射实体属性和数据库表中的字段名,value参数即为数据库表中的字段名。 |
| @TableField(value = "column_name", el = "role.id") | 映射实体属性和一个 SQL 片段,用法类似于 XML 中的 {} 或 #{},这里的示例中将在 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/