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());
        }
    }
  • 相关阅读:
    join()方法的使用
    synchronized关键字
    voliatle关键字
    一.线程概述
    NIO demo
    同步阻塞I/O
    Ubuntu16.04.1 安装Nginx
    垃圾收集
    如何从头开始安装 wordpress
    centos 6 安装 gnu c++ 等开发工具
  • 原文地址:https://www.cnblogs.com/se7end/p/14122938.html
Copyright © 2011-2022 走看看