zoukankan      html  css  js  c++  java
  • mybatis拦截器对SQL处理,数据权限逻辑控制

    import org.apache.ibatis.cache.CacheKey;
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.mapping.SqlCommandType;
    import org.apache.ibatis.plugin.*;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.util.Properties;
    
    @Intercepts(
            {
                    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
                    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
                    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
            }
    )
    public class SqlContextInterceptor implements Interceptor {
    
        private final Logger logger = LoggerFactory.getLogger(SqlContextInterceptor.class);
    
        private Properties properties;
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
    
            Executor executor = (Executor) invocation.getTarget();
    
            Method invocationMethod = invocation.getMethod();
    
            Object[] invocationArgs = invocation.getArgs();
    
            MappedStatement mappedStatement = (MappedStatement) invocationArgs[0];
    
            SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
    
            if (!SqlCommandType.SELECT.equals(sqlCommandType)) {
                return invocation.proceed();
            }
    
            Object parameter = invocationArgs[1];
            RowBounds rowBounds = (RowBounds) invocationArgs[2];
            ResultHandler resultHandler = (ResultHandler) invocationArgs[3];
    
            CacheKey cacheKey;
            BoundSql boundSql;
    
            //由于逻辑关系,只会进入一次
            if (invocationArgs.length == 4) {
                //4 个参数时
                boundSql = mappedStatement.getBoundSql(parameter);
                cacheKey = executor.createCacheKey(mappedStatement, parameter, rowBounds, boundSql);
            } else {
                //6 个参数时
                cacheKey = (CacheKey) invocationArgs[4];
                boundSql = (BoundSql) invocationArgs[5];
            }
    
            // 在这里增加数据权限逻辑
    
            return executor.query(mappedStatement, parameter, rowBounds, resultHandler, cacheKey, boundSql);
        }
    
        @Override
        public Object plugin(Object target) {
            if (target instanceof Executor) {
                return Plugin.wrap(target, this);
            }
            return target;
        }
    
        @Override
        public void setProperties(Properties properties) {
            this.properties = properties;
            this.logger.info(this.properties.toString());
        }
    }
  • 相关阅读:
    yum只下载不安装
    知乎的 Flink 数据集成平台建设实践
    饿了么EMonitor演进史
    手机淘宝轻店业务 Serverless 研发模式升级实践
    独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
    一文详解物化视图改写
    业务团队如何统一架构设计风格?
    Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
    开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
    Service Mesh 从“趋势”走向“无聊”
  • 原文地址:https://www.cnblogs.com/se7end/p/14122938.html
Copyright © 2011-2022 走看看