Mybatis Plus拦截器
Mybatis Plus使用拦截器控制补充SQL控制权限
·
1、POM依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency>
2、UserTypeInterceptor拦截器
package org.example.config;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.util.ArrayList;
import java.util.List;
public class UserTypeInterceptor extends JsqlParserSupport implements InnerInterceptor {
private final static Column USER_TYPE = new Column("user_type");
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
// 需处理方法
if (handleMethod(ms.getId())) {
PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
mpBs.sql(parserSingle(mpBs.sql(), null));
}
}
@Override
protected void processSelect(Select select, int index, String sql, Object obj) {
SelectBody selectBody = select.getSelectBody();
if (selectBody == null) {
return;
}
processPlainSelect((PlainSelect) selectBody);
}
/**
* 处理 PlainSelect
*/
protected void processPlainSelect(PlainSelect plainSelect) {
plainSelect.setWhere(builderExpression(plainSelect.getWhere()));
}
/**
* 处理条件
*/
protected Expression builderExpression(Expression currentExpression) {
InExpression userTypeExpression = new InExpression();
userTypeExpression.setLeftExpression(USER_TYPE);
ExpressionList expressionList=new ExpressionList();
List<Expression> expressionList1=new ArrayList<>();
expressionList1.add(new StringValue("01"));
expressionList.setExpressions(expressionList1);
userTypeExpression.setRightItemsList(expressionList);
if (currentExpression == null) {
return userTypeExpression;
}
return new AndExpression(currentExpression,userTypeExpression );
}
private boolean handleMethod(String method) {
return "org.example.mapper.UserMapper.list".contains(method);
}
}
3、Mybatis Plus配置文件添加拦截器
package org.example.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
interceptor.addInnerInterceptor(new UserTypeInterceptor());
return interceptor;
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)