作用:

为了避免高频的数据关联查询,一种方案是做数据冗余,将其他表的部分字段冗余到当前表。但是这个方案牵扯一个数据修改后如何同步的问题,本功能就是为了解决这个问题而生的。

讲解:

基于@DataSource注解,框架会自动注册监听EntityUpdateEvent事件,响应的所有MP的Mapper的updateById和updateBatchById两个方法会自动发布EntityUpdateEvent事件。因此,除了MP的updateById和updateBatchById两个更新方法外,其他数据更新方式(比如手动写sql的形式)不会触发数据自动更新,如果想触发需要用户自己抛出EntityUpdateEvent事件,完成数据自动更新。

示例:

假设用户评论的场景,评论上需要冗余用户名和头像,如果用户的名字和头像有改动,则需要同步新的改动,代码如下:

  1. @Data
  2. @Table(comment = "用户信息")
  3. public class User {
  4. @ColumnComment("主键")
  5. private String id;
  6. @ColumnComment("用户名")
  7. private String username;
  8. @ColumnComment("头像")
  9. private String icon;
  10. // 省略其他属性
  11. ......
  12. }
  1. @Data
  2. @Table(comment = "评论")
  3. public class Comment {
  4. @ColumnComment("主键")
  5. private String id;
  6. @ColumnComment("评论内容")
  7. private String content;
  8. @ColumnComment("评论人id")
  9. private String userId;
  10. // source指定了数据来源的Entity,同样可以使用sourceName来指定全路径的方式,field指定了映射哪个字段
  11. // conditions中隐含了一个joinField字段,该字段默认是“id”,即@Condition(selfField = "userId", joinField = "id")等同于示例中的写法
  12. @DataSource(source = User.class, field = "username", conditions = @Condition(selfField = "userId"))
  13. @ColumnComment("评论人名称")
  14. private String userName;
  15. // 如上,同理
  16. @DataSource(source = User.class, field = "icon", condition = @Condition(selfField = "userId"))
  17. @ColumnComment("评论人头像")
  18. private String userIcon;
  19. }