|
@@ -0,0 +1,104 @@
|
|
|
|
+package com.baomidou.mybatisplus.plugins;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+import org.apache.ibatis.executor.Executor;
|
|
|
|
+import org.apache.ibatis.logging.Log;
|
|
|
|
+import org.apache.ibatis.logging.LogFactory;
|
|
|
|
+import org.apache.ibatis.mapping.BoundSql;
|
|
|
|
+import org.apache.ibatis.mapping.MappedStatement;
|
|
|
|
+import org.apache.ibatis.mapping.ParameterMapping;
|
|
|
|
+import org.apache.ibatis.plugin.*;
|
|
|
|
+import org.apache.ibatis.reflection.MetaObject;
|
|
|
|
+import org.apache.ibatis.session.Configuration;
|
|
|
|
+import org.apache.ibatis.session.ResultHandler;
|
|
|
|
+import org.apache.ibatis.session.RowBounds;
|
|
|
|
+import org.apache.ibatis.type.TypeHandlerRegistry;
|
|
|
|
+
|
|
|
|
+import java.text.DateFormat;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Locale;
|
|
|
|
+import java.util.Properties;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * sql 日志打印
|
|
|
|
+ * Created by nieqiurong on 2017-02-09 09:07:58.
|
|
|
|
+ */
|
|
|
|
+@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 }) })
|
|
|
|
+public class SqlLogInterceptor implements Interceptor {
|
|
|
|
+
|
|
|
|
+ private static final Log logger = LogFactory.getLog(SqlLogInterceptor.class);
|
|
|
|
+
|
|
|
|
+ private Properties properties;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Object intercept(Invocation invocation) throws Throwable {
|
|
|
|
+ MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
|
|
|
|
+ Object parameter = null;
|
|
|
|
+ if (invocation.getArgs().length > 1) {
|
|
|
|
+ parameter = invocation.getArgs()[1];
|
|
|
|
+ }
|
|
|
|
+ BoundSql boundSql = mappedStatement.getBoundSql(parameter);
|
|
|
|
+ Configuration configuration = mappedStatement.getConfiguration();
|
|
|
|
+ Object returnValue;
|
|
|
|
+ returnValue = invocation.proceed();
|
|
|
|
+ String sql = getSql(configuration, boundSql);
|
|
|
|
+ if(logger.isDebugEnabled()){
|
|
|
|
+ logger.debug("\n\n Run SQL: "+sql+"\n");
|
|
|
|
+ }
|
|
|
|
+ return returnValue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static String getParameterValue(Object obj) {
|
|
|
|
+ String value;
|
|
|
|
+ if (obj instanceof String) {
|
|
|
|
+ value = obj!=null ? "'" + obj.toString() + "'":"''";
|
|
|
|
+ } else if (obj instanceof Date) {
|
|
|
|
+ if(obj instanceof java.sql.Date){
|
|
|
|
+ value = obj!=null ? "'" + obj.toString() + "'":"''";
|
|
|
|
+ }else {
|
|
|
|
+ DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
|
|
|
|
+ value = obj!=null ? "'" + formatter.format(obj) + "'":"''";
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ value = obj!=null ? obj.toString():"";
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static String getSql(Configuration configuration, BoundSql boundSql) {
|
|
|
|
+ Object parameterObject = boundSql.getParameterObject();
|
|
|
|
+ List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
|
|
|
|
+ String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
|
|
|
|
+ if (parameterMappings!=null&¶meterMappings.size() > 0 && parameterObject != null) {
|
|
|
|
+ TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
|
|
|
|
+ if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
|
|
|
|
+ sql = sql.replaceFirst("\\?", 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("\\?", getParameterValue(obj));
|
|
|
|
+ } else if (boundSql.hasAdditionalParameter(propertyName)) {
|
|
|
|
+ Object obj = boundSql.getAdditionalParameter(propertyName);
|
|
|
|
+ sql = sql.replaceFirst("\\?", getParameterValue(obj));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return sql;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Object plugin(Object target) {
|
|
|
|
+ return Plugin.wrap(target, this);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void setProperties(Properties properties) {
|
|
|
|
+ this.properties = properties;
|
|
|
|
+ }
|
|
|
|
+}
|