From 50a38e1eec9f9977bc999fbf78d6d6c163903f44 Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Thu, 27 Jul 2017 10:15:30 +0900 Subject: [PATCH] Allow replacing configuration properties on ProviderSqlSource Fixes gh-1057 --- .../builder/annotation/ProviderSqlSource.java | 19 +++++++++++++------ .../submitted/sqlprovider/OurSqlBuilder.java | 4 ++-- .../submitted/sqlprovider/mybatis-config.xml | 5 +++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java b/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java index 438a6267621..795248c6b7e 100644 --- a/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java +++ b/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java @@ -23,6 +23,7 @@ import org.apache.ibatis.builder.SqlSourceBuilder; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.parsing.PropertyParser; import org.apache.ibatis.reflection.ParamNameResolver; import org.apache.ibatis.session.Configuration; @@ -32,6 +33,7 @@ */ public class ProviderSqlSource implements SqlSource { + private final Configuration configuration; private final SqlSourceBuilder sqlSourceParser; private final Class providerType; private Method providerMethod; @@ -44,17 +46,18 @@ public class ProviderSqlSource implements SqlSource { * @deprecated Please use the {@link #ProviderSqlSource(Configuration, Object, Class, Method)} instead of this. */ @Deprecated - public ProviderSqlSource(Configuration config, Object provider) { - this(config, provider, null, null); + public ProviderSqlSource(Configuration configuration, Object provider) { + this(configuration, provider, null, null); } /** * @since 3.4.5 */ - public ProviderSqlSource(Configuration config, Object provider, Class mapperType, Method mapperMethod) { + public ProviderSqlSource(Configuration configuration, Object provider, Class mapperType, Method mapperMethod) { String providerMethodName; try { - this.sqlSourceParser = new SqlSourceBuilder(config); + this.configuration = configuration; + this.sqlSourceParser = new SqlSourceBuilder(configuration); this.providerType = (Class) provider.getClass().getMethod("type").invoke(provider); providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider); @@ -67,7 +70,7 @@ public ProviderSqlSource(Configuration config, Object provider, Class mapperT + "'. Sql provider method can not overload."); } this.providerMethod = m; - this.providerMethodArgumentNames = new ParamNameResolver(config, m).getNames(); + this.providerMethodArgumentNames = new ParamNameResolver(configuration, m).getNames(); this.providerMethodParameterTypes = m.getParameterTypes(); } } @@ -125,7 +128,7 @@ private SqlSource createSqlSource(Object parameterObject) { + " using a specifying parameterObject. In this case, please specify a 'java.util.Map' object."); } Class parameterType = parameterObject == null ? Object.class : parameterObject.getClass(); - return sqlSourceParser.parse(sql, parameterType, new HashMap()); + return sqlSourceParser.parse(replacePlaceholder(sql), parameterType, new HashMap()); } catch (BuilderException e) { throw e; } catch (Exception e) { @@ -158,4 +161,8 @@ private Object[] extractProviderMethodArguments(Map params, Stri return args; } + private String replacePlaceholder(String sql) { + return PropertyParser.parse(sql, configuration.getVariables()); + } + } diff --git a/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java b/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java index ea2b766774f..359badc4fc3 100644 --- a/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java +++ b/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java @@ -157,7 +157,7 @@ public String buildSelectByIdProviderContextOnly(ProviderContext context) { FROM(tableName); WHERE("id = #{id}"); if (!containsLogicalDelete){ - WHERE("logical_delete = false"); + WHERE("logical_delete = ${Constants.LOGICAL_DELETE_OFF}"); } }}.toString(); } @@ -172,7 +172,7 @@ public String buildSelectByNameOneParamAndProviderContext(ProviderContext contex WHERE("name like #{name} || '%'"); } if (!containsLogicalDelete){ - WHERE("logical_delete = false"); + WHERE("logical_delete = ${LOGICAL_DELETE_OFF:0}"); } }}.toString(); } diff --git a/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml b/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml index 4bc425497b3..0b9ca18ce28 100644 --- a/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml +++ b/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml @@ -22,6 +22,11 @@ + + + + +