赞
踩
在日常的开发过程中, DAO
层的数据库实体类(Entity
)中经常会有一些公共字段如 create_by
(创建人), create_time
(创建时间) 等字段,与业务基本无关且属于记录本身的属性字段。
这些字段通常会容易被大家忽视,每个 Entity 都去处理一遍比较麻烦耗时;如果忽略又会造成记录本身属性不完整,直到用到的时候才后悔莫及。
所以 Mybatis Plus
中的 MetaObjectHandler
就是针对这一问题的良好解决方案。MetaObjectHandler
中主要提供了两个方法:
public interface MetaObjectHandler { /** * 插入元对象字段填充(用于插入时对公共字段的填充) * * @param metaObject 元对象 */ void insertFill(MetaObject metaObject); /** * 更新元对象字段填充(用于更新时对公共字段的填充) * * @param metaObject 元对象 */ void updateFill(MetaObject metaObject); }
一般来说,这些公共字段我们都会封装在一个 Super Entity
类中,所以在这个类中,我们把所有更新和插入时需要做改动的字段都加上 @TableField
注解,并且设置 fill
属性。举例说明:
@Data public class BaseEntity implements Serializable { /** * 创建时间 */ @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; /** * 更新时间 */ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
FieldFill
是一个枚举类,其中定义了四种处理方法:
public enum FieldFill { /** * 默认不处理 */ DEFAULT, /** * 插入时填充字段 */ INSERT, /** * 更新时填充字段 */ UPDATE, /** * 插入和更新时填充字段 */ INSERT_UPDATE }
定义一个类实现 MetaObjectHandler
中的 insertFill
和 updateFill
抽象方法:
public class MetaHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // getFieldValByName 方法是父接口中的默认方法,用字段名字通过反射获取待插入对象中指定名字字段的值 Object createTime = getFieldValByName("createTime", metaObject); if (Objects.isNull(createTime)) { //同理, setFieldValByName 方法也是父接口中的默认方法,用字段名字通过反射设置待插入对象中指定名字字段的值 //插入时, createTime 字段默认为当前时间 setFieldValByName("createTime", new Date(), metaObject); } Object updateTime = getFieldValByName(UPDATE_TIME_FIELD, metaObject); if (Objects.isNull(updateTime)) { setFieldValByName(UPDATE_TIME_FIELD, new Date(), metaObject); } } @Override public void updateFill(MetaObject metaObject) { //更新时设置 updateTime 字段为当前时间 setFieldValByName(UPDATE_TIME_FIELD, LocalDateTime.now(), metaObject); } }
日常开发中,大多数场景下数据并不需要物理删除,而是采用一个字段来表示这个字段是否删除,也就是逻辑删除。
通常情况下,我们需要在删除的时候手动将这个值更新为被删除的枚举值。
在 Mybatis Plus
中,提供了一个 @TableLogic
注解, 代码如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TableLogic { /** * 默认逻辑未删除值(该值可无、会自动获取全局配置) */ String value() default ""; /** * 默认逻辑删除值(该值可无、会自动获取全局配置) */ String delval() default ""; }
所以当我们需要用到逻辑删除的字段时,可以使用如下方式:
@TableLogic(delval = "1", value = "0")
private String delete;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。