作用:

根据预先设置的条件函数,对数据的更新、删除、查询做筛选操作。

示例:

比如根据不同权限获取不同数据,用户只能看到自己的数据,管理员能看到所有人的数据,我们通常需要在每一个查询、更新、删除的sql操作上都追加上某个条件,这种操作比较机械化,而且某些情况下很容易忘记,可以抽象成注解直接配置到Entity上,就省去了每个数据操作关心这个特殊条件了。

  1. /**
  2. * congfig中注册动态条件拦截器【1.3.0之前的版本(不包括1.3.0)可以忽略,不注册该Bean】
  3. */
  4. @Bean
  5. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  7. // 添加动态条件,若同时添加了其他的拦截器,继续添加即可
  8. interceptor.addInnerInterceptor(new DynamicConditionInterceptor());
  9. return interceptor;
  10. }
  1. @Data
  2. @Table(comment = "文章")
  3. public class Article {
  4. @ColumnComment("主键")
  5. private String id;
  6. @ColumnComment("标题")
  7. private String title;
  8. @ColumnComment("内容")
  9. private String content;
  10. @ColumnComment("发布人")
  11. @InsertOptionUser(UserIdAutoFillHandler.class)
  12. // 添加了该注解后,针对文章的查询、修改、删除操作,均会被自动带上 published_user_id=?或者published_user_id in (?)的条件,?值来自于CurrentUserDynamicConditionHandler的values()返回值
  13. @DynamicCondition(CurrentUserDynamicConditionHandler.class)
  14. private String publishedUserId;
  15. // 省略其他字段
  16. ......
  17. }
  1. @Component
  2. public class CurrentUserDynamicConditionHandler implements IDynamicConditionHandler {
  3. @Resource
  4. private HttpServletRequest request;
  5. @Override
  6. public List<Object> values() {
  7. // 只有当enable()返回true的时候 本动态条件才生效。
  8. // 返回空集合或者null的时候,sql上体现的是 [column] is null,只返回一个值的时候sql上体现的是 [column]=***,
  9. // 返回集合的时候,sql上体现的是 [column] in (***)
  10. String userId = request.getHeader("USER_ID");
  11. return Collections.singletonList(userId);
  12. }
  13. @Override
  14. public boolean enable() {
  15. // 简单例子:header中取用户权限,如果是非管理员则执行该过滤条件,如果是管理员默认查全部,返回false,本动态条件失效
  16. String userRule = request.getHeader("USER_ROLE");
  17. return !"ADMIN".equals(userRule);
  18. }
  19. }