在多张表中同时存在创建时间、创建人、修改时间、修改人等字段,这些基础字段属于公共字段,那能不能对于这些公共字段在某个地方统一进行处理,从而简化开发,针对这个场景,就可以采用Mybatis Plus提供的公共字段自动填充功能。
-
在实体类的属性上加入@TableField注解,并根据属性fill指定字段填充策略。其中填充策略有INSERT:插入时填充字段,UPDATE:更新时填充字段,INSERT_UPDATE:插入和更新时填充字段。
1.javapackage com.app.studypro.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; /** * 用户信息 * * @author Administrator */ @Data public class User implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ private Long id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 性别 */ private String sex; /** * 状态 0:禁用,1:正常 */ private Integer status; /** * 创建时间 */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * 更新时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * 创建人 */ @TableField(fill = FieldFill.INSERT) private Long createUser; /** * 修改人 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * 是否删除 */ private Integer isDeleted; }
-
然后自定义元对象字段填充控制器,实现公共字段自动写入,实现的接口类为MetaObjectHandler,并在实现类上添加注解@Component,从而添加到spring容器中,并实现insertFill(插入元对象字段填充方法)和updateFill(更新元对象字段填充方法),从而在插入和更新的操作方法处在保存数据时将会将指定的字段进行自动填充,无需一个个编写代码进行设置处理。
1.javapackage com.app.studypro.common; import com.app.studypro.utils.UserUtil; 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.time.LocalDateTime; /** * 自定义元对象字段填充控制器,实现公共字段自动写入 * * @author Administrator */ @Slf4j @Component public class CustomMetaObjectHandler implements MetaObjectHandler { /** * 插入元对象字段填充(用于插入时对公共字段的填充) * * @param metaObject 元对象 */ @Override public void insertFill(MetaObject metaObject) { log.info("插入时对公共字段的填充"); LocalDateTime now = LocalDateTime.now(); Long currentUserId = UserUtil.getCurrentUserId(); metaObject.setValue("createTime", now); metaObject.setValue("updateTime", now); metaObject.setValue("createUser", currentUserId); metaObject.setValue("updateUser", currentUserId); } /** * 更新元对象字段填充(用于更新时对公共字段的填充) * * @param metaObject 元对象 */ @Override public void updateFill(MetaObject metaObject) { log.info("更新时对公共字段的填充"); LocalDateTime now = LocalDateTime.now(); Long currentUserId = UserUtil.getCurrentUserId(); metaObject.setValue("updateTime", now); metaObject.setValue("updateUser", currentUserId); } }