diff --git a/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java b/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java index a84c3cae930..58f99420bff 100644 --- a/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java +++ b/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java @@ -1,5 +1,5 @@ /** - * Copyright 2009-2019 the original author or authors. + * Copyright 2009-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.StringTokenizer; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.mapping.SqlSource; @@ -42,10 +43,29 @@ public SqlSourceBuilder(Configuration configuration) { public SqlSource parse(String originalSql, Class parameterType, Map additionalParameters) { ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType, additionalParameters); GenericTokenParser parser = new GenericTokenParser("#{", "}", handler); - String sql = parser.parse(originalSql); + String sql; + if (configuration.isShrinkWhitespacesInSql()) { + sql = parser.parse(removeExtraWhitespaces(originalSql)); + } else { + sql = parser.parse(originalSql); + } return new StaticSqlSource(configuration, sql, handler.getParameterMappings()); } + public static String removeExtraWhitespaces(String original) { + StringTokenizer tokenizer = new StringTokenizer(original); + StringBuilder builder = new StringBuilder(); + boolean hasMoreTokens = tokenizer.hasMoreTokens(); + while (hasMoreTokens) { + builder.append(tokenizer.nextToken()); + hasMoreTokens = tokenizer.hasMoreTokens(); + if (hasMoreTokens) { + builder.append(' '); + } + } + return builder.toString(); + } + private static class ParameterMappingTokenHandler extends BaseBuilder implements TokenHandler { private List parameterMappings = new ArrayList<>(); diff --git a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java index c55ea66298e..a9ca156c647 100644 --- a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java +++ b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java @@ -268,6 +268,7 @@ private void settingsElement(Properties props) { configuration.setReturnInstanceForEmptyRow(booleanValueOf(props.getProperty("returnInstanceForEmptyRow"), false)); configuration.setLogPrefix(props.getProperty("logPrefix")); configuration.setConfigurationFactory(resolveClass(props.getProperty("configurationFactory"))); + configuration.setShrinkWhitespacesInSql(booleanValueOf(props.getProperty("shrinkWhitespacesInSql"), false)); } private void environmentsElement(XNode context) throws Exception { diff --git a/src/main/java/org/apache/ibatis/logging/jdbc/BaseJdbcLogger.java b/src/main/java/org/apache/ibatis/logging/jdbc/BaseJdbcLogger.java index e086d782540..2390b83686f 100644 --- a/src/main/java/org/apache/ibatis/logging/jdbc/BaseJdbcLogger.java +++ b/src/main/java/org/apache/ibatis/logging/jdbc/BaseJdbcLogger.java @@ -1,5 +1,5 @@ /** - * Copyright 2009-2019 the original author or authors. + * Copyright 2009-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,9 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.StringTokenizer; import java.util.stream.Collectors; +import org.apache.ibatis.builder.SqlSourceBuilder; import org.apache.ibatis.logging.Log; import org.apache.ibatis.reflection.ArrayUtil; @@ -120,14 +120,8 @@ protected void clearColumnInfo() { columnValues.clear(); } - protected String removeBreakingWhitespace(String original) { - StringTokenizer whitespaceStripper = new StringTokenizer(original); - StringBuilder builder = new StringBuilder(); - while (whitespaceStripper.hasMoreTokens()) { - builder.append(whitespaceStripper.nextToken()); - builder.append(" "); - } - return builder.toString(); + protected String removeExtraWhitespace(String original) { + return SqlSourceBuilder.removeExtraWhitespaces(original); } protected boolean isDebugEnabled() { diff --git a/src/main/java/org/apache/ibatis/logging/jdbc/ConnectionLogger.java b/src/main/java/org/apache/ibatis/logging/jdbc/ConnectionLogger.java index dfbfd098b74..160811d21cb 100644 --- a/src/main/java/org/apache/ibatis/logging/jdbc/ConnectionLogger.java +++ b/src/main/java/org/apache/ibatis/logging/jdbc/ConnectionLogger.java @@ -50,7 +50,7 @@ public Object invoke(Object proxy, Method method, Object[] params) } if ("prepareStatement".equals(method.getName()) || "prepareCall".equals(method.getName())) { if (isDebugEnabled()) { - debug(" Preparing: " + removeBreakingWhitespace((String) params[0]), true); + debug(" Preparing: " + removeExtraWhitespace((String) params[0]), true); } PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params); stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack); diff --git a/src/main/java/org/apache/ibatis/logging/jdbc/StatementLogger.java b/src/main/java/org/apache/ibatis/logging/jdbc/StatementLogger.java index 327fb610333..727b01460e3 100644 --- a/src/main/java/org/apache/ibatis/logging/jdbc/StatementLogger.java +++ b/src/main/java/org/apache/ibatis/logging/jdbc/StatementLogger.java @@ -48,7 +48,7 @@ public Object invoke(Object proxy, Method method, Object[] params) throws Throwa } if (EXECUTE_METHODS.contains(method.getName())) { if (isDebugEnabled()) { - debug(" Executing: " + removeBreakingWhitespace((String) params[0]), true); + debug(" Executing: " + removeExtraWhitespace((String) params[0]), true); } if ("executeQuery".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(statement, params); diff --git a/src/main/java/org/apache/ibatis/session/Configuration.java b/src/main/java/org/apache/ibatis/session/Configuration.java index d427f97ed63..c1cd04d1ecc 100644 --- a/src/main/java/org/apache/ibatis/session/Configuration.java +++ b/src/main/java/org/apache/ibatis/session/Configuration.java @@ -113,6 +113,7 @@ public class Configuration { protected boolean callSettersOnNulls; protected boolean useActualParamName = true; protected boolean returnInstanceForEmptyRow; + protected boolean shrinkWhitespacesInSql; protected String logPrefix; protected Class logImpl; @@ -266,6 +267,14 @@ public void setReturnInstanceForEmptyRow(boolean returnEmptyInstance) { this.returnInstanceForEmptyRow = returnEmptyInstance; } + public boolean isShrinkWhitespacesInSql() { + return shrinkWhitespacesInSql; + } + + public void setShrinkWhitespacesInSql(boolean shrinkWhitespacesInSql) { + this.shrinkWhitespacesInSql = shrinkWhitespacesInSql; + } + public String getDatabaseId() { return databaseId; } diff --git a/src/site/es/xdoc/configuration.xml b/src/site/es/xdoc/configuration.xml index 44f66a02673..ae995427efb 100644 --- a/src/site/es/xdoc/configuration.xml +++ b/src/site/es/xdoc/configuration.xml @@ -1,7 +1,7 @@