如何优雅的填充公共字段
在平时的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