MybatisPlus的MetaObjectHandler与@TableLogic使用

 更新时间:2024年04月29日 09:22:33   作者:Bryant5051  
这篇文章主要介绍了MybatisPlus的MetaObjectHandler与@TableLogic使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.MetaObjectHandler 实现公共字段自动填充功能

1.1 日常开发中的公共字段

在日常的开发过程中, DAO层的数据库实体类(Entity)中经常会有一些公共字段如 create_by(创建人), create_time(创建时间) 等字段,与业务基本无关且属于记录本身的属性字段。

这些字段通常会容易被大家忽视,每个 Entity 都去处理一遍比较麻烦耗时;如果忽略又会造成记录本身属性不完整,直到用到的时候才后悔莫及。

1.2 Mybatis Plus 中的解决方案

所以 Mybatis Plus 中的 MetaObjectHandler 就是针对这一问题的良好解决方案。

MetaObjectHandler 中主要提供了两个方法:

public interface MetaObjectHandler {
    
    /**
     * 插入元对象字段填充(用于插入时对公共字段的填充)
     *
     * @param metaObject 元对象
     */
    void insertFill(MetaObject metaObject);

    /**
     * 更新元对象字段填充(用于更新时对公共字段的填充)
     *
     * @param metaObject 元对象
     */
    void updateFill(MetaObject metaObject);
}

1.3 用法

1.3.1 定义公共字段超类,并在字段上添加注解

一般来说,这些公共字段我们都会封装在一个 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
}

1.3.2 实现 MetaObjectHandler 接口

定义一个类实现 MetaObjectHandler 中的 insertFillupdateFill 抽象方法:

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);
    }
}

2. Mybatis Plus 实现逻辑删除

2.1 目前的逻辑删除

日常开发中,大多数场景下数据并不需要物理删除,而是采用一个字段来表示这个字段是否删除,也就是逻辑删除。

通常情况下,我们需要在删除的时候手动将这个值更新为被删除的枚举值。

2.2 Mybatis Plus 提供的解决方案

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;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在MyBatis中使用<、<= 等特殊符号详解

    在MyBatis中使用<、<= 等特殊符号详解

    这篇文章主要介绍了在MyBatis中使用<、<= 等特殊符号方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 使用JPA进行CriteriaQuery进行查询的注意事项

    使用JPA进行CriteriaQuery进行查询的注意事项

    这篇文章主要介绍了使用JPA进行CriteriaQuery进行查询的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot使用Redis实现分布式锁

    SpringBoot使用Redis实现分布式锁

    这篇文章主要为大家详细介绍了SpringBoot使用Redis实现分布式锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • SpringBoot线程池和Java线程池的使用和实现原理解析

    SpringBoot线程池和Java线程池的使用和实现原理解析

    这篇文章主要介绍了SpringBoot线程池和Java线程池的用法和实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • SpringBoot使用@Cacheable出现预览工具乱码的解决方法

    SpringBoot使用@Cacheable出现预览工具乱码的解决方法

    直接使用注解进行缓存数据,我们再使用工具去预览存储的数据时发现是乱码,这是由于默认序列化的问题,所以接下来将给大家介绍一下SpringBoot使用@Cacheable出现预览工具乱码的解决方法,需要的朋友可以参考下
    2023-10-10
  • java常用Lambda表达式使用场景源码示例

    java常用Lambda表达式使用场景源码示例

    这篇文章主要为大家介绍了java常用Lambda表达式使用场景源码示例及应用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 一篇文章带你深入了解Java基础(4)

    一篇文章带你深入了解Java基础(4)

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • SpringBoot读取配置的6种方式

    SpringBoot读取配置的6种方式

    本文主要介绍了SpringBoot读取配置的6种方式,主要包括使用默认配置、使用application.properties文件、使用application.yml文件、使用@Value注解、使用Environment对象和使用ConfigurableEnvironment对象,感兴趣的可以了解一下
    2023-08-08
  • 基于Java Socket实现一个简易在线聊天功能(一)

    基于Java Socket实现一个简易在线聊天功能(一)

    这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧
    2016-05-05
  • Java的String类中的startsWith方法和endsWith方法示例详解

    Java的String类中的startsWith方法和endsWith方法示例详解

    大家应该都知道startsWith()方法用于检测字符串是否以指定的前缀开始,endsWith()方法用于测试字符串是否以指定的后缀结束,本文就Java的String类中的startsWith方法和endsWith方法给大家详细讲解,感兴趣的朋友一起看看吧
    2023-11-11

最新评论