作用:

可以在数据对数据库做插入或更新操作的时候,自动赋值数据操作人、操作时间、默认值等属性。

示例:

以文章发布为例,在发布Artice的时候,我们无需再去关心过多的与业务无关的字段值,最终只需要关心title、content两个核心数据即可,其他的数据均会被框架处理。
其中分别涉及了数据插入数据更新数据插入及更新三个处理时机,其中每个时机均可以插入系统时间及自定义用户信息。

  1. @Data
  2. @Table(comment = "文章")
  3. public class Article {
  4. // 字符串类型的ID,默认也是雪花算法的一串数字(MP的默认功能)
  5. @ColumnComment("主键")
  6. private String id;
  7. @ColumnComment("标题")
  8. private String title;
  9. @ColumnComment("内容")
  10. private String content;
  11. // 默认值用法:文章默认激活状态,ACTIVE为ActicleStatusEnum[ACTIVE, INACTIVE]的枚举名称字符串
  12. @DefaultValue("ACTIVE")
  13. @ColumnComment("内容")
  14. private ActicleStatusEnum status;
  15. @ColumnComment("发布时间")
  16. // 【插入】数据时候会自动获取系统当前时间赋值,支持多种数据类型,具体可参考@OptionDate注解详细介绍(注意,这里的时间是MP执行insert的操作的时候的时间,并不是对象构建时候的时间)
  17. @InsertOptionDate
  18. private Date publishedTime;
  19. @ColumnComment("发布人")
  20. // 【插入】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码
  21. @InsertOptionUser(UserIdAutoFillHandler.class)
  22. private String publishedUserId;
  23. @ColumnComment("发布人名字")
  24. // 【插入】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码
  25. @InsertOptionUser(UsernameAutoFillHandler.class)
  26. private String publishedUsername;
  27. @ColumnComment("最后更新时间")
  28. // 【插入和更新】数据时候会自动获取系统当前时间赋值,支持多种数据类型,具体可参考@OptionDate注解详细介绍
  29. @InsertUpdateOptionDate
  30. private Date publishedTime;
  31. @ColumnComment("最后更新人")
  32. // 【更新】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码
  33. // @UpdateOptionUser(UserIdAutoFillHandler.class)
  34. // 【插入和更新】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码
  35. @InsertUpdateOptionUser(UserIdAutoFillHandler.class)
  36. private String publishedUserId;
  37. @ColumnComment("最后更新人名字")
  38. // 【更新】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码
  39. // @UpdateOptionUser(UsernameAutoFillHandler.class)
  40. // 【插入和更新】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码
  41. @InsertUpdateOptionUser(UsernameAutoFillHandler.class)
  42. private String publishedUsername;
  43. }
  1. /**
  2. * 全局获取用户ID
  3. * 此处实现IOptionByAutoFillHandler接口和AutoFillHandler接口均可,建议实现IOptionByAutoFillHandler接口,
  4. * 因为框架内的BaseEntity默认需要IOptionByAutoFillHandler的实现。后面会讲到BaseEntity的使用。
  5. */
  6. @Component
  7. public class UserIdAutoFillHandler implements IOptionByAutoFillHandler<String> {
  8. /**
  9. * @param object 当前操作的数据对象
  10. * @param clazz 当前操作的数据对象的class
  11. * @param field 当前操作的数据对象上的字段
  12. * @retur
  13. */
  14. @Override
  15. public String getVal(Object object, Class<?> clazz, Field field) {
  16. RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
  17. HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
  18. // 配合网关或者过滤器,token校验成功后就把用户信息塞到header中
  19. return request.getHeader("user-id");
  20. }
  21. }
  1. /**
  2. * 全局获取用户名
  3. */
  4. @Component
  5. public class UsernameAutoFillHandler implements AutoFillHandler<String> {
  6. /**
  7. * @param object 当前操作的数据对象
  8. * @param clazz 当前操作的数据对象的class
  9. * @param field 当前操作的数据对象上的字段
  10. * @return 当前登录用户id
  11. */
  12. @Override
  13. public String getVal(Object object, Class<?> clazz, Field field) {
  14. RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
  15. HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
  16. // 配合网关或者过滤器,token校验成功后就把用户信息塞到header中
  17. return request.getHeader("user-name");
  18. }
  19. }