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()&¶meterObject!=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) { } }
mybatis 获取根据条件查询sql
最新推荐文章于 2024-10-18 15:06:23 发布