com.ext_ext.mybatisext.plugin.SQLPrintPlugin Maven / Gradle / Ivy
package com.ext_ext.mybatisext.plugin;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
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.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.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 com.ext_ext.mybatisext.environment.EnvironmentDetect;
@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 SQLPrintPlugin implements Interceptor {
@Override
public Object intercept( Invocation invocation ) throws Throwable {
if ( EnvironmentDetect.detectEnvironment().isProduct() ) {
return invocation.proceed();
} else {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = null;
if ( invocation.getArgs().length > 1 ) {
parameter = invocation.getArgs()[1];
}
String sqlId = mappedStatement.getId();
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
Configuration configuration = mappedStatement.getConfiguration();
Object returnValue = null;
long start = System.currentTimeMillis();
try {
returnValue = invocation.proceed();
} finally {
long end = System.currentTimeMillis();
long time = (end - start);
// 打印查询时间大于50ms的sql语句
String sql = getSql(configuration, boundSql, sqlId, time);
Log logger = LogFactory.getLog(sqlId);
if ( time > 100 ) {
logger.warn(sql);
System.err.println(sql);
} else {
logger.debug(sql);
}
}
return returnValue;
}
}
@SuppressWarnings("unused")
public static String getSql( Configuration configuration, BoundSql boundSql, String sqlId, long time ) {
StringBuilder str;
try {
String sql = showSql(configuration, boundSql);
str = new StringBuilder(100);
// str.append(sqlId);
// str.append(":");
str.append(sql);
str.append(":");
str.append(time);
str.append("ms");
return str.toString();
} catch ( Exception e ) {
}
return "";
}
private static 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((Date) obj) + "'";
} else {
if ( obj != null ) {
value = obj.toString();
}
}
return value;
}
public static String showSql( Configuration configuration, BoundSql boundSql ) {
Object parameterObject = boundSql.getParameterObject();
List parameterMappings = boundSql.getParameterMappings();
String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
if ( parameterMappings.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 properties0 ) {
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy