Java SpringBoot Mybatis
使用Mybatis的时候,Mybatis提倡的是简单,官方也没有类似的功能,这个时候如果业务需要审计数据的时候需要手工维护,这时候可以模仿JPA实现一个类似的功能,如下:

使用Mybatis Plus插件

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>${version}</version>
  5. </dependency>

自定义实现自动填充Handler

  1. public class AuditMetaObjectHandler extends MetaObjectHandler {
  2. @Override
  3. public void insertFill(MetaObject metaObject) {
  4. boolean createDate = metaObject.hasSetter("createDate");
  5. boolean updateDate = metaObject.hasSetter("updateDate");
  6. if (createDate || updateDate) {
  7. Date now = new Date();
  8. if (createDate) {
  9. this.setFieldValByName("createDate", now, metaObject);
  10. }
  11. if (updateDate) {
  12. this.setFieldValByName("updateDate", now, metaObject);
  13. }
  14. }
  15. String username = ...;//获取用户,如果使用SpringSecurity的话可以从SecurityContext中获取
  16. if (metaObject.hasSetter("createUser")) {
  17. this.setFieldValByName("createUser", username, metaObject);
  18. }
  19. if (metaObject.hasSetter("updateUser")) {
  20. this.setFieldValByName("updateUser", username, metaObject);
  21. }
  22. }
  23. @Override
  24. public void updateFill(MetaObject metaObject) {
  25. if (metaObject.hasSetter("updateDate")) {
  26. this.setFieldValByName("updateDate", new Date(), metaObject);
  27. }
  28. if (metaObject.hasSetter("updateUser")) {
  29. // TODO 获取用户,如果使用SpringSecurity的话可以从SecurityContext中获取
  30. String username = ...;
  31. this.setFieldValByName("updateUser", username, metaObject);
  32. }
  33. }
  34. }

启用配置

MybatisPlusConfigurer配置中新增配置

  1. /**
  2. * 审计数据插件
  3. *
  4. * @return AuditMetaObjectHandler
  5. */
  6. @Bean
  7. @ConditionalOnMissingBean(name = "auditMetaObjectHandler")
  8. public AuditMetaObjectHandler auditMetaObjectHandler() {
  9. return new AuditMetaObjectHandler();
  10. }

配置实体类

  1. public class UserDO implement Serializable{
  2. //TODO 省略
  3. /**
  4. * 创建时间
  5. */
  6. @TableField(value = "create_date", fill = FieldFill.INSERT)
  7. private Date createDate;
  8. /**
  9. * 创建用户
  10. */
  11. @TableField(value = "create_user", fill = FieldFill.INSERT)
  12. private String createUser;
  13. /**
  14. * 更新时间
  15. */
  16. @TableField("update_date", fill = FieldFill.INSERT_UPDATE)
  17. private Date updateDate;
  18. /**
  19. * 更新用户
  20. */
  21. @TableField("update_user", fill = FieldFill.INSERT_UPDATE)
  22. private String updateUser;
  23. }

总结

这样就可以实现类似 Spring Data JPA 的审计功能