Mybatis Plus版本:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
原理:
- 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
- 注解填充字段
@TableField(.. fill = FieldFill.INSERT)
生成器策略部分也可以配置
public class User {
// 注意!这里需要标记为填充字段
@TableField(.. fill = FieldFill.INSERT)
private Date createTime;
....
}
需求实现的效果,当创建时间不设置的时候,默认是当前系统时间,当创建时间传的时候,已传的为准,不存当前时间:
自定义实现类 CrmMetaObjectHandler
package org.jeecg.common.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 时间控制全局配置
*
* @author: jacklin
* @since: 2021/5/10 10:45
**/
@Slf4j
@Component
public class CrmMetaObjectHandler implements MetaObjectHandler {
/**
* setFieldValByName方法中参数分别为实体类的属性名(驼峰)、要填充的值,元数据对象
**/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
Object createTime = getFieldValByName("createTime", metaObject);
if (createTime == null) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
注意事项:
- 填充原理是直接给
entity
的属性设置值!!! - 注解则是指定该属性在对应情况下必有值,如果无值则入库会是
null
MetaObjectHandler
提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null
则不填充- 字段必须声明
TableField
注解,属性fill
选择对应策略,该声明告知Mybatis-Plus
需要预留注入SQL
字段 - 填充处理器
MyMetaObjectHandler
在 Spring Boot 中需要声明@Component
或@Bean
注入 - 要想根据注解
FieldFill.xxx
和字段名
以及字段类型
来区分必须使用父类的strictInsertFill
或者strictUpdateFill
方法 - 不需要根据任何来区分可以使用父类的
fillStrategy
方法 - update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}