如何优雅的填充公共字段
在平时的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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步