MybatisPlus 的 MetaObjectHandler 与 @TableLogic

文章目录

  • 1.MetaObjectHandler 实现公共字段自动填充功能
    • 1.1 日常开发中的公共字段
    • 1.2 Mybatis Plus 中的解决方案
    • 1.3 用法
      • 1.3.1 定义公共字段超类,并在字段上添加注解
      • 1.3.2 实现 MetaObjectHandler 接口
  • 2. Mybatis Plus 实现逻辑删除
    • 2.1 目前的逻辑删除
    • 2.2 Mybatis Plus 提供的解决方案

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 {@Overridepublic 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);}}@Overridepublic 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树 —— 原理和算法详细介绍

红黑树 —— 原理和算法详细介绍 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性: 每个节点或…

微服务雪崩效应与 Hystrix

文章目录微服务雪崩效应微服务中常见的容错方案常见的服务容错思路Hystrix 简介微服务雪崩效应 微服务系统中, 每一个服务专心于自己的业务逻辑, 并对外提供相应的接口, 看上去似乎耦合度比较低, 但经常会遇见这样一种场景: 可以看到, 当 C 服务挂掉时, B 服务还在不断地调用…

MySQL count(1) , count(*), count(列名) 的异同

count 函数主要用于统计行数,我们一般会用 count(1) , count(*), count(列名) 来统计行数,但是这三者之间有什么差距呢? 异同 当 count(列名) 在列名不是主键列的情况下,将只统计该列的非空行数,效率也最低下;当 count(列名) 在列名为主键列,且在没有非聚集索引的情况下,三者…

时间复杂度到底怎么算

时间复杂度到底怎么算 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡…

Java 异常种类及处理方法

概述 异常的基类是 Throwable, Throwable 有两个子类: Exception : 表示可以恢复的异常, 编译器可以捕捉。Error : 表示编译时和系统错误, 表示系统在运行期间出现了严重的错误, 属于不可恢复的错误。 受检异常和非受检异常 受检异常指的是在编译期间会接受编译器检查, 且必…

十分钟搞定时间复杂度(算法的时间复杂度)

十分钟搞定时间复杂度(算法的时间复杂度) 我们假设计算机运行一行基础代码需要执行一次运算。 int aFunc(void) {printf("Hello, World!\n"); // 需要执行 1 次return 0; // 需要执行 1 次 }那么上面这个方法需要执行 2 次运算 …

Java 父子类加载顺序

现在有一个Parent类和一个Son类, 代码分别如下: public class Parent {static {System.out.println(" order 0");}private static String s init();{System.out.println(" order 3");}public Parent() {System.out.println(" order 4");}publi…

java实现简单二叉树

二叉树基本知识: 一、树的定义 树是一种数据结构,它是由n(n>1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有…

HashMap 学习笔记

1.HashMap 的类继承关系 图示即为 Map 相关类的继承关系。源码中的类签名如下: public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {...... }2.HashMap 的底层存储结构 HashMap 的底层存储结构是 Node 类,…

MySQL中清空表和截断表的区别(新手入门)

清空表和截断表 清空表&#xff1a;delete from users&#xff1b; 清空表只是清空表中的逻辑数据&#xff0c;但是物理数据不清除&#xff0c;如主键值、索引等不被清除&#xff0c;还是原来的值。 截断表&#xff1a;truncate table users&#xff1b; 截断表可以用于删除…

终止线程的方法

如何终止一个正在运行的线程&#xff1f; 设置状态位来终止一个正在运行的线程。可以自己实现, 也可以使用 interrupt 方法来设置这个状态位, 然后在代码中判断 isInterrupted 的返回结果来执行退出执行的逻辑。 了解 Thread 类中的 stop、interrupt 方法吗?为什么不用 stop…

十大经典排序算法动画与解析(配代码完全版)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见的内部排序算法有&…

服务启动不了,显示 config 异常的问题排查

文章目录问题详情排查过程1.1 查看配置文件是否可以正常加载1.2 进入 config 服务正在运行的容器, 查看文件是否存在1.3 查看容器运行日志:最后发现是配置文件中多了一个 TAB 符,唉,说多了都是泪!问题详情 出现异常报错: Could not locate PropertySource and the fail fast p…

java使用Socket类接收和发送数据

java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分&#xff0c;而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上&#xff0c;并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用&a…

Docker Swarm compose 文件 depends_on 属性

Swarm 部署时候如果需要管理应用之间的启动先后顺序,则可以使用 services.depends_on 属性进行指定,例如 services:eureka-service:......depends_on:- config-service......

Java 单例模式:懒加载(延迟加载)和即时加载

Java 单例模式&#xff1a;懒加载&#xff08;延迟加载&#xff09;和即时加载 引言 在开发中&#xff0c;如果某个实例的创建需要消耗很多系统资源&#xff0c;那么我们通常会使用惰性加载机制&#xff08;或懒加载、延时加载&#xff09;&#xff0c;也就是说只有当使用到这…

递推算法之滚动数组思维方式

概述 在算法的最终结果只用到本层与上一层的结果时&#xff0c; 可以使用滚动数组思想。 简单的理解就是每次都使用固定的几个存储空间达到压缩节省存储空间的作用&#xff0c; 主要用在递推算法中。示例1&#xff1a; 爬楼梯问题 假设你正在爬楼梯。需要 n 阶你才能到达楼顶…

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…

判断链表是否相交并找出交点

问题概述 单链表定义如下&#xff1a; public class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}}编写程序&#xff0c; 找出两个链表的交点。 如图所示&#xff0c;链表 A 和链表 B 在节点 8 处相交。 算法思路 首先确定一个事情&#xff1a; …