在MyBatisPlus中使用@TableField完成字段自动填充的操作
场景
官方文档:
字段注解@TableField
com.baomidou.mybatisplus.annotations.TableField
值 | 描述 |
---|---|
value | 字段值(驼峰命名方式,该值可无) |
update | 预处理set字段自定义注入 |
condition | 预处理WHERE实体条件自定义运算规则 |
el | 详看注释说明 |
exist | 是否为数据库表字段(默认true存在,false不存在) |
strategy | 字段验证(默认非null判断,查看com.baomidou.mybatisplus.enums.FieldStrategy) |
fill | 字段填充标记(FieldFill,配合自动填充使用) |
字段填充策略FieldFill
值 | 描述 |
---|---|
DEFAULT | 默认不处理 |
INSERT | 插入填充字段 |
UPDATE | 更新填充字段 |
INSERT_UPDATE | 插入和更新填充字段 |
实现
实体类中有如下属性,通过上面的自动填充属性,我们可以实现
在进行插入操作时对
添加了注解@TableField(fill=FieldFill.INSERT)
的字段进行自动填充。
对添加了注解@TableField(fill=FieldFill.INSERT_UPDATE)
的字段在进行插入和更新时进行自动填充。
/** *创建人 */ @TableField(fill=FieldFill.INSERT) privateLongcreatorId; /** *创建时间 */ @TableField(fill=FieldFill.INSERT) privateDategmtCreat; /** *修改人 */ @TableField(fill=FieldFill.INSERT_UPDATE) privateLongmodifierId; /** *修改时间 */ @TableField(fill=FieldFill.INSERT_UPDATE) privateDategmtModified; /** *是否可用 */ @TableField(fill=FieldFill.INSERT) privateBooleanavailableFlag;
这样我们在具体业务中对实体类进行赋值就可以不用对这些公共字段进行赋值,在执行插入或者更新时就能自动赋值并插入数据库。
那么要自动赋的值在哪里配置?
在项目的config包下新建自动填充处理类使其实现接口MetaObjectHandler
并重写其方法:
packagecom.ws.api.config; importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler; importorg.apache.ibatis.reflection.MetaObject; importorg.springframework.stereotype.Component; importjava.util.Date; /** *自动填充处理类 *@authorbadao *@version1.0 *@see **/ @Component publicclassMyMetaObjectHandlerimplementsMetaObjectHandler{ @Override publicvoidinsertFill(MetaObjectmetaObject){ this.setFieldValByName("modifierId",newLong(111),metaObject); this.setFieldValByName("gmtModified",newDate(),metaObject); this.setFieldValByName("creatorId",newLong(111),metaObject); this.setFieldValByName("gmtCreat",newDate(),metaObject); this.setFieldValByName("availableFlag",true,metaObject); } @Override publicvoidupdateFill(MetaObjectmetaObject){ this.setFieldValByName("modifierId",newLong(111),metaObject); this.setFieldValByName("gmtModified",newDate(),metaObject); } }
其中方法参数中第一个是前面自动填充所对应的字段,第二个是要自动填充的值。
补充:Mybatis-Plus里@TableField注解自动赋值功能的配置类
packagecom.jt.auto; importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler; importorg.apache.ibatis.reflection.MetaObject; importorg.springframework.stereotype.Component; importjava.util.Date; //完成自动填充功能 @Component//将该对象交给spring容器管理 publicclassMyMetaObjectHandlerimplementsMetaObjectHandler{ /** *在POJO中添加了新增/更新的注解,但是必须在数据库的字段中完成赋值的操作. *所以.必须明确,新增/更新时操作的是哪个字段,及值是多少 ***@parammetaObject */ @Override publicvoidinsertFill(MetaObjectmetaObject){ this.setInsertFieldValByName("created",newDate(),metaObject); this.setInsertFieldValByName("updated",newDate(),metaObject); } @Override publicvoidupdateFill(MetaObjectmetaObject){ this.setUpdateFieldValByName("updated",newDate(),metaObject); } }
@TableField注解完成自动填充赋值使用案例:
packagecom.jt.pojo; importjava.io.Serializable; importjava.util.Date; importcom.baomidou.mybatisplus.annotation.FieldFill; importcom.baomidou.mybatisplus.annotation.TableField; importlombok.Data; importlombok.experimental.Accessors; //pojo基类,完成2个任务,2个日期,实现序列化 @Data @Accessors(chain=true) publicclassBasePojoimplementsSerializable{ @TableField(fill=FieldFill.INSERT)//新增有效 privateDatecreated; @TableField(fill=FieldFill.INSERT_UPDATE)//新增和更新有效 privateDateupdated; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。