반응형
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="callSettersOnNulls" value="true" /> <setting name="jdbcTypeForNull" value="NULL" /> </settings> <plugins> <plugin interceptor="kr.go.safepeople.config.interceptor.MybatisSqlLogInterceptor" /> </plugins> </configuration> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | import java.lang.reflect.Field; import java.sql.Statement; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.session.ResultHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Intercepts({ @Signature(type=StatementHandler.class, method="update", args={Statement.class}) ,@Signature(type=StatementHandler.class, method="query", args={Statement.class, ResultHandler.class}) }) public class MybatisSqlLogInterceptor implements Interceptor { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public Object intercept(Invocation invocation) throws Throwable { // TODO Auto-generated method stub StatementHandler handler = (StatementHandler)invocation.getTarget(); BoundSql boundSql = handler.getBoundSql(); String sql = boundSql.getSql(); Object param = handler.getParameterHandler().getParameterObject(); if(param == null){ sql = sql.replaceFirst("\\?", "''"); }else{ if(param instanceof Integer || param instanceof Long || param instanceof Float || param instanceof Double){ sql = sql.replaceFirst("\\?", param.toString()); }else if(param instanceof String){ sql = sql.replaceFirst("\\?", "'" + param + "'"); }else if(param instanceof Map){ List<ParameterMapping> paramMapping = boundSql.getParameterMappings(); for(ParameterMapping mapping : paramMapping){ String propValue = mapping.getProperty(); Object value = ((Map) param).get(propValue); if(value != null){ if(value instanceof String){ sql = sql.replaceFirst("\\?", "'" + value + "'"); }else{ sql = sql.replaceFirst("\\?", value.toString()); } }else{ sql = sql.replaceFirst("\\?", "'null'"); } } }else{ List<ParameterMapping> paramMapping = boundSql.getParameterMappings(); Class<? extends Object> paramClass = param.getClass(); for(ParameterMapping mapping : paramMapping){ String propValue = mapping.getProperty(); Field field = paramClass.getDeclaredField(propValue); field.setAccessible(true); Class<?> javaType = mapping.getJavaType(); if(String.class == javaType){ sql = sql.replaceFirst("\\?", "'" + field.get(param) + "'"); }else{ sql = sql.replaceFirst("\\?", field.get(param).toString()); } } } } logger.debug("====================================================================="); logger.debug("SQL : "+sql); logger.debug("====================================================================="); return invocation.proceed(); } @Override public Object plugin(Object target) { // TODO Auto-generated method stub return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // TODO Auto-generated method stub } } | cs |