作用:
根据预先设置的条件函数,对数据的更新、删除、查询做筛选操作。
示例:
比如根据不同权限获取不同数据,用户只能看到自己的数据,管理员能看到所有人的数据,我们通常需要在每一个查询、更新、删除的sql操作上都追加上某个条件,这种操作比较机械化,而且某些情况下很容易忘记,可以抽象成注解直接配置到Entity上,就省去了每个数据操作关心这个特殊条件了。
/*** congfig中注册动态条件拦截器【1.3.0之前的版本(不包括1.3.0)可以忽略,不注册该Bean】*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加动态条件,若同时添加了其他的拦截器,继续添加即可interceptor.addInnerInterceptor(new DynamicConditionInterceptor());return interceptor;}
@Data@Table(comment = "文章")public class Article {@ColumnComment("主键")private String id;@ColumnComment("标题")private String title;@ColumnComment("内容")private String content;@ColumnComment("发布人")@InsertOptionUser(UserIdAutoFillHandler.class)// 添加了该注解后,针对文章的查询、修改、删除操作,均会被自动带上 published_user_id=?或者published_user_id in (?)的条件,?值来自于CurrentUserDynamicConditionHandler的values()返回值@DynamicCondition(CurrentUserDynamicConditionHandler.class)private String publishedUserId;// 省略其他字段......}
@Componentpublic class CurrentUserDynamicConditionHandler implements IDynamicConditionHandler {@Resourceprivate HttpServletRequest request;@Overridepublic List<Object> values() {// 只有当enable()返回true的时候 本动态条件才生效。// 返回空集合或者null的时候,sql上体现的是 [column] is null,只返回一个值的时候sql上体现的是 [column]=***,// 返回集合的时候,sql上体现的是 [column] in (***)String userId = request.getHeader("USER_ID");return Collections.singletonList(userId);}@Overridepublic boolean enable() {// 简单例子:header中取用户权限,如果是非管理员则执行该过滤条件,如果是管理员默认查全部,返回false,本动态条件失效String userRule = request.getHeader("USER_ROLE");return !"ADMIN".equals(userRule);}}
