Mybatis-Plus 优雅处理字段填充
前言
在数据库操作中,有些字段的值在插入或更新时需要自动填充,比如创建时间、更新时间、操作用户信息等
@TableField#fill
注解的作用
字段自动填充策略。该属性用于指定在执行数据库操作(如插入、更新)时,如何自动填充字段的值。通过使用 FieldFill 枚举,可以灵活地控制字段的填充行为。
通过在实体类字段上添加 @TableField#fill 注解,可以轻松地指定字段在不同操作下的自动填充方式,避免了重复代码逻辑。
package com.baomidou.mybatisplus.annotation;
/**
* 字段填充策略枚举类
*
* <p>
* 判断注入的 insert 和 update 的 sql 脚本是否在对应情况下忽略掉字段的 if 标签生成
* <if test="...">......</if>
* 判断优先级比 {@link FieldStrategy} 高
* </p>
*
* @author hubin
* @since 2017-06-27
*/
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
主要用法
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
高级用法
自定义填充策略: 可以通过实现 MetaObjectHandler 接口,自定义填充逻辑。
package cn.phixlin.conf;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
/**
* @author 01434107
* @description
* @date 2024/11/27 15:15
*/
@Slf4j
@Configuration
public class MybatisPlusConf implements MetaObjectHandler {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "deleteFlag", Integer.class, 0);}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}
总结
@TableField#fill
注解作为 MyBatis Plus 提供的重要特性,使字段的自动填充变得更加便捷和高效。无论是基本的自动填充,还是自定义的填充逻辑,注解都能够满足各种情况下的需求。通过合理使用这一注解,能够轻松地指定字段在不同操作下的自动填充方式,减少冗余代码的编写,提升持久层开发的效率和代码质量。
License:
CC BY 4.0