mybatis 获取根据条件查询sql

Intercepts({
        @Signature(type = Executor.class,method = "update",args ={MappedStatement.class,Object.class}),
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})
})
@Component
public class SQLInterceptor implements Interceptor {


    private static  final Logger logger = LoggerFactory.getLogger(SQLInterceptor.class);
    private static  final Logger sqlLogger = LoggerFactory.getLogger("mybatisSql");
    private static String[] officeIdNames= new String[]{"OFFICE_ID","OFFICEID","PK_OFFICE_ID"};

    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        try {
            MappedStatement mappedStatement=(MappedStatement) invocation.getArgs()[0];

            Object parameter =null;
            if (invocation.getArgs().length>1){
                parameter =invocation.getArgs()[1];
            }
            //获取sqlId
            String sqlId = mappedStatement.getId();
            BoundSql boundSql = mappedStatement.getBoundSql(parameter);
            Configuration configuration = mappedStatement.getConfiguration();
            //获取真实的sql语句
            String sql = getSql(configuration,boundSql,sqlId,0);

            if (hasOfficeId(sql,officeIdNames)){
                sqlLogger.warn("{}",sql);
            }else {
                sqlLogger.info("{}",sql);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(),e);
        }
        return invocation.proceed();
    }

    private boolean hasOfficeId(String sql, String[] officeIdNames) {
        if (sql ==null||sql.trim().length() == 0){
            return false;
        }
       String afterWhereStatement = sql.toUpperCase().substring(sql.indexOf("WHERE"));
        for (String officeIdName : officeIdNames) {
            if (afterWhereStatement.indexOf(officeIdName)>0){
                return true;
            }
        }
        return  false;
    }

    private String getSql(Configuration configuration, BoundSql boundSql, String sqlId, int i) {
        String sql =showSql(configuration,boundSql);
        StringBuilder str = new StringBuilder(100);
       // str.append(sqlId);
        //str.append(":");
        str.append(sql);
        return str.toString();
    }

    private String showSql(Configuration configuration, BoundSql boundSql) {
        Object parameterObject =boundSql.getParameterObject();
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        String sql=boundSql.getSql().replaceAll("[\\s]+"," ");
        if (!parameterMappings.isEmpty()&&parameterObject!=null){
            TypeHandlerRegistry typeHandlerRegistry =configuration.getTypeHandlerRegistry();
            if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())){
                sql=sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject)));
            }else {
                MetaObject metaObject = configuration.newMetaObject(parameterObject);
                for (ParameterMapping parameterMapping : parameterMappings) {
                    String propertyName = parameterMapping.getProperty();
                    if (metaObject.hasGetter(propertyName)){
                        Object obj = metaObject.getValue(propertyName);
                        sql = sql.replaceFirst("\\?",Matcher.quoteReplacement(getParameterValue(obj)));
                    }else if (boundSql.hasAdditionalParameter(propertyName)){
                        Object obj = boundSql.getAdditionalParameter(propertyName);
                        sql=sql.replaceFirst("\\?",Matcher.quoteReplacement(getParameterValue(obj)));
                    }else {
                        sql=sql.replaceFirst("\\?","缺失");
                    }
                }
            }
        }
        return sql;
    }

    private String getParameterValue(Object obj) {

         String value =null;
         if (obj instanceof  String){
             value = " '"+obj.toString()+" '";
         }else if (obj instanceof Date){
             DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.CHINA);
             value =" '"+formatter.format(new Date()+" '");
         }else {
             if (obj!=null){
                 value =obj.toString();
             }else {
                 value="";
             }
         }
         return value;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target,this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值