最近在做需求的时候需要获取执行的SQL,特此记录一下
日志工具类ILogUtil方法
/**
*
* @Description: 读取带参数的SQL语句
* @interfaceName: getSql
* @author
* @return String
* @param mappedStatement
* @param whereMap
* @return
*/
public static String getSql(MappedStatement mappedStatement, Map<String, Object> whereMap) {
Configuration configuration = mappedStatement.getConfiguration();
// String sqlId = mappedStatement.getId();
BoundSql boundSql = mappedStatement.getBoundSql(whereMap);
String sql = showSql(configuration, boundSql);
StringBuilder str = new StringBuilder(100);
// str.append(sqlId);
// str.append(":");
str.append(sql);
return str.toString();
}
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(2, 2, Locale.CHINA);
value = "'" + formatter.format(new Date()) + "'";
} else if (obj != null) {
value = obj.toString();
} else {
value = "";
}
return value;
}
public static String showSql(Configuration configuration, BoundSql boundSql) {
Object parameterObject = boundSql.getParameterObject();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
MetaObject metaObject;
if ((CollectionUtils.isNotEmpty(parameterMappings)) && (parameterObject != null)) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject)));
} else {
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;
}
Map<String, Object> whereMap = new HashMap<>();
whereMap.put("wheres", dataMap);
String namespace = "com.erp.service.salereport.dao.SalereportServiceImplDao";
String idStr = "select_order_detail";
String mappedStatementName = namespace + "." + idStr;
MappedStatement mappedStatement = sqlSessionFactory.getConfiguration()
.getMappedStatement(mappedStatementName);
String sqlStr = ILogUtil.getSql(mappedStatement, whereMap);
sqlSessionFactory通过@Autowired引入org.apache.ibatis.session.SqlSessionFactory,namespace指的是xml文件的namespace值,idStr指的是xml文件的id值