摘要
做数据权限,支持自定义sql的实现,不可避免的要进行mybatis的插件开发,这里记录一下
环境:
mybatis-plus+oracle
思路
- 调用接口的时候,准备处理好的条件。
- 拦截指定的方法,进行参数校验
- 校验的相关的参数,进行sql的分析处理。
- 把处理好的sql,封装回去。
实现
/**
* <p>
* mybatis插件开发
* </p>
*
* @author caoqibei
* @Dare: 2021/4/23 9:54
*/
@Intercepts({
// 拦截的对象,对象的方法,方法的参数
@Signature(type = Executor.class, method = "query",
args = {
MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
// 加入到spring容器中,自动生效,mybatis插件机制,会自动扫描所有的Interceptor 实现类。
@Component
@Log4j2
public class DataInterceptor implements Interceptor {
static int MAPPED_STATEMENT_INDEX = 0;
static int PARAMETER_INDEX = 1;
static int ROW_BOUNDS_INDEX = 2;
static int RESULT_HANDLER_INDEX = 3;
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
DataInfo info = findDataInfo(args[PARAMETER_INDEX]);
if (info != null){
log.info("此方法开启数据过滤");
// 需要数据过滤
final MappedStatement ms = (MappedStatement)args[MAPPED_STATEMENT_INDEX];
final Object parameter = args[PARAMETER_INDEX];
final BoundSql boundSql = ms.getBoundSql(parameter);
log.info("sql处理前:" + boundSql.getSql());
String sql = boundSql.getSql().trim();
String dataSql = getDataSql(sql, info);
log.