首页 > 其他分享 >如何优雅的填充公共字段

如何优雅的填充公共字段

时间:2024-08-06 22:28:57浏览次数:12  
标签:metaObject 填充 TIMESTAMP 公共 优雅 SQL Mybatis

如何优雅的填充公共字段

在平时的web开发中,最多的就是编写CRUD逻辑,而CRUD中有很多公共字段,比如创建时间、创建人、更新时间、更新人等,这些字段在每次新增和修改的时候都需要手动填充,这样无疑增加了代码量,降低了开发效率,那么有没有一种优雅的方式来实现这些公共字段的填充呢?

1. 建表时利用SQL原生语法

对于一些简单的字段,比如创建时间、更新时间、逻辑删除等,我们可以在建表的时候利用SQL的原生语法来自动填充这些字段。

CREATE TABLE tb_user (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  is_deleted INT DEFAULT 0
);

2. 使用Mybatis-Plus的MetaObjectHandler

Mybatis-Plus是一个Mybatis的增强工具,它提供了很多方便的功能,包括自动填充公共字段。我们可以通过实现MetaObjectHandler接口来自定义公共字段的填充规则,然后在实体类中使用@TableField注解来指定需要自动填充的字段,这样在新增和修改的时候,Mybatis-Plus会自动填充这些字段,无需手动编写代码。

// User Entity
@Data
@TableName(value = "tb_user")
public class User {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private String username;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}

// MetaObjectHandler
@Component
public class MetaAutoFill implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        Date now = new Date();
        this.setFieldValByName("createTime", now, metaObject);
        this.setFieldValByName("updateTime", now, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

3. 使用Mybatis的拦截器

除了使用Mybatis-Plus,我们还可以使用Mybatis的拦截器来实现公共字段的自动填充。我们可以通过实现Interceptor接口来自定义拦截规则,然后在拦截器中获取到当前执行的SQL语句和参数,然后判断SQL语句的类型,如果是新增或修改操作,则自动填充公共字段。

这种方式实现相对复杂,但是也是最灵活的方式,可以配合自定义注解、AOP等技术来实现更优雅的代码。

因为Intercepter器是Mybatis的核心组件,并且可以拿到到Mybatis的执行上下文包括当前执行的SQL语句和参数,因此也可以配合一些SQL解析库来动态的修改SQL语句(如JSQLParser等)实现Sql的动态修改、校验等定制化功能。

总结

以上是几种常见的实现公共字段自动填充的方式,每种方式都有其优缺点,具体选择哪种方式需要根据实际情况来决定。

标签:metaObject,填充,TIMESTAMP,公共,优雅,SQL,Mybatis
From: https://www.cnblogs.com/licwuu/p/18346099

相关文章

  • MyBatis-Pager: 一个轻量且优雅的 MyBatis 分页组件
    优点无侵入:仅需在mapper层接口中增加Pager<T>参数即可。零配置:无需额外增加配置项,能够自动推断数据库分页方言。使用方法SpringBoot2项目引入maven依赖<dependency><groupId>cn.codest</groupId><artifactId>mybatis-pager-spring-boot2-starter</art......
  • go的并发任务如何优雅的实现错误终止
    errgroup使用案例在Go语言中,并发任务通常通过goroutine来实现,而错误处理和任务终止的优雅性则依赖于适当的同步机制和错误传播策略。场景:管理一个任务的一组子任务,每个子任务一个协程每个子任务必须保证都成功,一个出现失败应当立马停止所有子任务想知道子任务失败的原因......
  • 【禁止血压飙升】阿里大佬写的 Controller 太优雅了!
    作者:小塵链接:https://juejin.cn/post/7357172505961578511前言见过几千行代码的controller吗?我见过。见过全是trycatch的controller吗,我见过。见过全是字段校验的controller吗,我见过。见过全是业务代码的controller吗?不好意思,我们公司很多业务写在controller的......
  • 代码随想录day20 || 235 二叉搜索树最近公共祖先,701 二叉搜索树插入,450,二叉搜索树删除
    235二叉搜索树最近公共祖先unclowestCommonAncestor(root,p,q*TreeNode)*TreeNode{ //本题相较于普通二叉树寻找最近公共祖先加了题设条件二叉搜索树,所以使用二叉搜索树特性 //如果root大于两个目标节点,那么目标都在root左子树 //如果root小于两个目标节点,那么目......
  • leaflet实现绘制省市区域边界并填充颜色
    leaflet实现绘制省市区域边界并填充颜色asyncinitMap(){this.map=L.map("map",{center:[30.998257,103.653534],zoom:11,attributionControl:false,//隐藏logozoomControl:false,crs:L.CRS.Baidu,});......
  • 推荐一款界面优雅、功能强大的 .NET + Vue 权限管理系统
    前言今天推荐一款用.NET和Vue3实现的开源权限管理系统。它的界面清爽干净,功能强大,还具备灵活的角色权限分配功能,能够满足不同规模企业的管理需求。无论你是开发新手还是大神,都能轻松上手,快速搭建起自己的权限管理体系。别再犹豫了,赶快来试试吧!项目简介Malus是海棠的意思,顾......
  • 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.N
    前言这算是一篇学习记录博客了,主要是学习语义内核(SemanticKernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspire项目,不用每个项目单独起......
  • 代码随想录 day 44 最长公共子序列 | 不相交的线 | 最大子序和 | 判断子序列
    最长公共子序列最长公共子序列解题思路本题dp数组的含义是最长公共序列,而后同时遍历两个字符串,遇到相同的字母是公共子序列+1,否则取两个字符串的公共子序列中较长的一个。知识点动态规划,子序列心得没有想到比较两个字符串的公共子序列。我自己是遇到相同字母时将所有后续的......
  • 最近公共祖先(LCA)
    lca目前主要是树剖求。不断跳到重链顶点的父亲,是\(O(\log(n))\)的时间复杂度,但实际比倍增跑得快很多。在求lca的过程中可以顺便把两点间的距离求出来,需要提前预处理len=点到重链顶点的长度。lca在树上差分用处大。下面是一些例题。P3128[USACO15DEC]MaxFlowP树......
  • 代码随想录算法训练营Day18 | Leetcode 530 二叉搜索树的最小绝对差 Leetcode 236 二
    前言今天有一道题目没写,二叉搜索树中的众数,有点太难理解了,先放一放。Leetcode530二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:二叉搜索树的性质是中序遍历为升序的,所以我们想找最小绝......