|
|
@@ -0,0 +1,156 @@
|
|
|
+package com.java110.core.trace;
|
|
|
+
|
|
|
+import com.java110.core.log.LoggerFactory;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.ibatis.mapping.BoundSql;
|
|
|
+import org.apache.ibatis.mapping.MappedStatement;
|
|
|
+import org.apache.ibatis.mapping.ParameterMapping;
|
|
|
+import org.apache.ibatis.mapping.ParameterMode;
|
|
|
+import org.apache.ibatis.plugin.*;
|
|
|
+import org.apache.ibatis.reflection.MetaObject;
|
|
|
+import org.apache.ibatis.session.Configuration;
|
|
|
+import org.apache.ibatis.session.RowBounds;
|
|
|
+import org.apache.ibatis.type.TypeHandlerRegistry;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import sun.plugin2.main.server.ResultHandler;
|
|
|
+
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Properties;
|
|
|
+import java.util.concurrent.Executor;
|
|
|
+
|
|
|
+@Intercepts
|
|
|
+ ({
|
|
|
+ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
|
|
|
+ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
|
|
|
+ })
|
|
|
+public class Java110TraceSqlInterceptor implements Interceptor {
|
|
|
+
|
|
|
+ private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object intercept(Invocation invocation) throws Throwable {
|
|
|
+ MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
|
|
|
+ Object parameterObject = null;
|
|
|
+ if (invocation.getArgs().length > 1) {
|
|
|
+ parameterObject = invocation.getArgs()[1];
|
|
|
+ }
|
|
|
+
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+
|
|
|
+ Object result = invocation.proceed();
|
|
|
+
|
|
|
+ //String statementId = mappedStatement.getId();
|
|
|
+ BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
|
|
|
+ Configuration configuration = mappedStatement.getConfiguration();
|
|
|
+
|
|
|
+ long end = System.currentTimeMillis();
|
|
|
+ long timing = end - start;
|
|
|
+
|
|
|
+ Java110TraceFactory.putDbs(boundSql.getSql(), getSqlParam(boundSql, parameterObject, configuration), timing);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object plugin(Object target) {
|
|
|
+ if (target instanceof Executor) {
|
|
|
+ return Plugin.wrap(target, this);
|
|
|
+ }
|
|
|
+ return target;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setProperties(Properties properties) {
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getSqlParam(BoundSql boundSql, Object parameterObject, Configuration configuration) {
|
|
|
+
|
|
|
+ List<String> values = new ArrayList<>();
|
|
|
+ List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
|
|
|
+ TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
|
|
|
+ if (parameterMappings != null) {
|
|
|
+ for (int i = 0; i < parameterMappings.size(); i++) {
|
|
|
+ ParameterMapping parameterMapping = parameterMappings.get(i);
|
|
|
+ if (parameterMapping.getMode() != ParameterMode.OUT) {
|
|
|
+ Object value;
|
|
|
+ String propertyName = parameterMapping.getProperty();
|
|
|
+ if (boundSql.hasAdditionalParameter(propertyName)) {
|
|
|
+ value = boundSql.getAdditionalParameter(propertyName);
|
|
|
+ } else if (parameterObject == null) {
|
|
|
+ value = null;
|
|
|
+ } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
|
|
|
+ value = parameterObject;
|
|
|
+ } else {
|
|
|
+ MetaObject metaObject = configuration.newMetaObject(parameterObject);
|
|
|
+ value = metaObject.getValue(propertyName);
|
|
|
+ }
|
|
|
+ values.add(getValue(value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return StringUtils.join(values, "|");
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getValue(Object propertyValue) {
|
|
|
+ String result;
|
|
|
+ if (propertyValue != null) {
|
|
|
+ if (propertyValue instanceof String) {
|
|
|
+ result = "'" + propertyValue + "'";
|
|
|
+ } else if (propertyValue instanceof Date) {
|
|
|
+ result = "'" + DATE_FORMAT.format(propertyValue) + "'";
|
|
|
+ } else {
|
|
|
+ result = propertyValue.toString();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ result = "null";
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+// private String getSql(BoundSql boundSql, Object parameterObject, Configuration configuration) {
|
|
|
+// String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
|
|
|
+// List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
|
|
|
+// TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
|
|
|
+// if (parameterMappings != null) {
|
|
|
+// for (int i = 0; i < parameterMappings.size(); i++) {
|
|
|
+// ParameterMapping parameterMapping = parameterMappings.get(i);
|
|
|
+// if (parameterMapping.getMode() != ParameterMode.OUT) {
|
|
|
+// Object value;
|
|
|
+// String propertyName = parameterMapping.getProperty();
|
|
|
+// if (boundSql.hasAdditionalParameter(propertyName)) {
|
|
|
+// value = boundSql.getAdditionalParameter(propertyName);
|
|
|
+// } else if (parameterObject == null) {
|
|
|
+// value = null;
|
|
|
+// } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
|
|
|
+// value = parameterObject;
|
|
|
+// } else {
|
|
|
+// MetaObject metaObject = configuration.newMetaObject(parameterObject);
|
|
|
+// value = metaObject.getValue(propertyName);
|
|
|
+// }
|
|
|
+// sql = replacePlaceholder(sql, value);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return sql;
|
|
|
+// }
|
|
|
+
|
|
|
+// private String replacePlaceholder(String sql, Object propertyValue) {
|
|
|
+// String result;
|
|
|
+// if (propertyValue != null) {
|
|
|
+// if (propertyValue instanceof String) {
|
|
|
+// result = "'" + propertyValue + "'";
|
|
|
+// } else if (propertyValue instanceof Date) {
|
|
|
+// result = "'" + DATE_FORMAT.format(propertyValue) + "'";
|
|
|
+// } else {
|
|
|
+// result = propertyValue.toString();
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// result = "null";
|
|
|
+// }
|
|
|
+// return sql.replaceFirst("\\?", Matcher.quoteReplacement(result));
|
|
|
+// }
|
|
|
+}
|