为了能到远方,脚下的每一步都不能少.|

licwuu

园龄:2年5个月粉丝:0关注:0

2024-08-06 22:26阅读: 28评论: 0推荐: 0

如何优雅的填充公共字段

在平时的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的动态修改、校验等定制化功能。

总结

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

本文作者:licwuu

本文链接:https://www.cnblogs.com/licwuu/p/18346099

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   licwuu  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起