经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
MyBatis-Plus实现字段自动填充功能的示例
来源:jb51  时间:2021/11/9 15:10:24  对本文有异议

一、前言

在项目中,我们有一些公共的字段需要做修改

如:

  • gmt_create:创建时间
  • creator_id:创建人
  • gmt_modified:修改时间
  • modifier_id:修改人

这时候我们可以采用 MyBatis-Plus 中的字段自动填充功能去实现

思路:抽取公用字段封装到BaseEntity类中,再将使用到此公共字段的类继承基类,最后由 MyBatis-Plus 帮我们实现自动填充,这样我们便可以在service服务类中减少一定代码重复量!

二、实现

1. 实体类

  1. @Data
  2. @TableName("t_user")
  3. public class User extends BaseEntity<User> {
  4.  
  5. private static final long serialVersionUID = 1L;
  6.  
  7. @TableId(value = "id", type = IdType.AUTO)
  8. private Integer id;
  9. @TableField("username")
  10. private String username;
  11. @Override
  12. protected Serializable pkVal() {
  13. return this.id;
  14. }
  15. }

2. 公用字段 - 使用注解填充字段

如:@TableField(fill = FieldFill.INSERT)

  1. @Getter
  2. @Setter
  3. public abstract class BaseEntity<T extends Model> extends Model {
  4. /**
  5. * 创建日期 - 现在时表示主动创建
  6. */
  7. @TableField(value = "gmt_create", fill = FieldFill.INSERT)
  8. private Date gmtCreate;
  9. /**
  10. * 修改时间 - 过去分词表示被动更新
  11. */
  12. @TableField(value = "gmt_modified", fill = FieldFill.INSERT_UPDATE)
  13. private Date gmtModified;
  14. }

Ctrl 选中FieldFill进入源码可查看相应字段填充策略枚举类,如下:

  1. public enum FieldFill {
  2. DEFAULT(0, "默认不处理"),
  3. INSERT(1, "插入填充字段"),
  4. UPDATE(2, "更新填充字段"),
  5. INSERT_UPDATE(3, "插入和更新填充字段");
  6. /**
  7. * 主键
  8. */
  9. private final int key;
  10. /**
  11. * 描述
  12. */
  13. private final String desc;
  14. FieldFill(final int key, final String desc) {
  15. this.key = key;
  16. this.desc = desc;
  17. }
  18. public static FieldFill getIgnore(int key) {
  19. FieldFill[] fis = FieldFill.values();
  20. for (FieldFill fi : fis) {
  21. if (fi.getKey() == key) {
  22. return fi;
  23. }
  24. }
  25. return FieldFill.DEFAULT;
  26. }
  27. public int getKey() {
  28. return this.key;
  29. }
  30. public String getDesc() {
  31. return this.desc;
  32. }
  33. }

3. 自定义MyMetaObjectHandler字段自动填充处理类继承MetaObjectHandler

注:在 Spring Boot 中需要声明@Component 注入

  1. /**
  2. * <p> MyBatisPlus自定义字段自动填充处理类 - 实体类中使用 @TableField注解 </p>
  3. *
  4. * @description: 注意前端传值时要为null
  5. * @author: zhengqing
  6. * @date: 2019/8/18 0018 1:46
  7. */
  8. @Component
  9. public class MyMetaObjectHandler extends MetaObjectHandler {
  10.  
  11. private static final Logger LOG = LoggerFactory.getLogger(MyMetaObjectHandler.class);
  12.  
  13. /**
  14. * 创建时间
  15. */
  16. @Override
  17. public void insertFill(MetaObject metaObject) {
  18. LOG.info(" -------------------- start insert fill ... --------------------");
  19. if (metaObject.hasGetter("gmtCreate") && metaObject.hasGetter("gmtModified")) {
  20. setFieldValByName("gmtCreate", new Date(), metaObject);
  21. setFieldValByName("gmtModified", new Date(), metaObject);
  22. }
  23. }
  24.  
  25. /**
  26. * 最后一次更新时间
  27. */
  28. @Override
  29. public void updateFill(MetaObject metaObject) {
  30. LOG.info(" -------------------- start update fill ... --------------------");
  31. if (metaObject.hasGetter("et.gmtModified")) {
  32. setFieldValByName("gmtModified", new Date(), metaObject);
  33. }
  34. }
  35. }

温馨小提示:

我们在更新字段的时候要使用 et.字段名 或者 param1.字段 才会生效!

原因:我们可以debug模式查看metaObject中的属性发现多了et

在这里插入图片描述

或者 查看继承的BaseMapper类源码,我们也可以发现更新的方法中都有et

在这里插入图片描述

而插入的方法并没有et

在这里插入图片描述

另外一个注意点就是,自动填充是在执行完插入或更新方法之后,也就是说,MyBatis-Plus会在方法之后判断@TableField注解的字段有没有被手动更新,如果没有才会走自定义的实现类MyMetaObjectHandler

到此这篇关于MyBatis-Plus实现字段自动填充功能的示例的文章就介绍到这了,更多相关MyBatis-Plus 字段自动填充内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号