public class MyBatisSqlUtils {
@Resource
private SqlSessionFactory sessionFactory;
private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
/**
* 运行期获取MyBatis执行的SQL及参数
*
* @param id Mapper xml 文件里的select Id
* @param parameterMap 参数
* @param sqlSessionFactory
* @return MyBatisSql
*/
@SuppressWarnings("rawtypes")
public MyBatisSql getMyBatisSql(String id, Map<String, Object> parameterMap) {
MyBatisSql ibatisSql = new MyBatisSql();
MappedStatement ms = sessionFactory.getConfiguration().getMappedStatement(id);
BoundSql boundSql = ms.getBoundSql(parameterMap);
ibatisSql.setSql(boundSql.getSql());
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings != null) {
Object[] parameterArray = new Object[parameterMappings.size()];
ParameterMapping parameterMapping = null;
Object value = null;
Object parameterObject = null;
MetaObject metaObject = null;
PropertyTokenizer prop = null;
String propertyName = null;
String[] names = null;
for (int i = 0; i < parameterMappings.size(); i++) {
parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
propertyName = parameterMapping.getProperty();
names = propertyName.split("\\.");
if (propertyName.indexOf(".") != -1 && names.length == 2) {
parameterObject = parameterMap.get(names[0]);
propertyName = names[1];
} else if (propertyName.indexOf(".") != -1 && names.length == 3) {
parameterObject = parameterMap.get(names[0]); // map
if (parameterObject instanceof Map) {
parameterObject = ((Map) parameterObject).get(names[1]);
}
propertyName = names[2];
} else {
parameterObject = parameterMap.get(propertyName);
}
metaObject = parameterMap == null ? null : MetaObject.forObject(parameterObject, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
prop = new PropertyTokenizer(propertyName);
if (parameterObject == null) {
value = null;
} else if (ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX) && boundSql.hasAdditionalParameter(prop.getName())) {
value = boundSql.getAdditionalParameter(prop.getName());
if (value != null) {
value = MetaObject.forObject(value, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY).getValue(propertyName.substring(prop.getName().length()));
}
} else {
value = metaObject == null ? null : metaObject.getValue(propertyName);
}
parameterArray[i] = value;
}
}
ibatisSql.setParameters(parameterArray);
}
return ibatisSql;
}
public void setSessionFactory(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
类:
public class MyBatisSql {
/** * 运行期 sql */
private String sql;
/** * 参数 数组 */
private Object[] parameters;
public void setSql(String sql) {
this.sql = sql;
}
/**
* @return 无参数值sql【方便测试】
*/
public String getSql() {
return sql;
}
/**
* @return 有参数值sql【方便测试】
*/
public String getSql1() {
return coventToSql(1);
}
/**
* @return 有参数格式优化sql【方便保存】
*/
public String getSql2() {
return coventToSql(2);
}
private String coventToSql(int type) {
if (parameters == null || sql == null) {
return "";
}
List<Object> parametersArray = Arrays.asList(parameters);
List<Object> list = new ArrayList<Object>(parametersArray);
while (sql.indexOf("?") != -1 && list.size() > 0
&& parameters.length > 0) {
sql = sql.replaceFirst("\\?", "'" + list.get(0).toString() + "'");
list.remove(0);
}
if (type == 2) {
sql = sql.replaceAll("\\s|\t|\r|\n+", "\t");
return sql.replaceAll("\t+", " ");
}
return sql.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
public Object[] getParameters() {
return parameters;
}
}