diff --git a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafSqlSource.java b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafSqlSource.java index 3d26f4e..bf5a615 100644 --- a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafSqlSource.java +++ b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafSqlSource.java @@ -18,6 +18,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Locale; import java.util.Map; @@ -90,16 +91,19 @@ public BoundSql getBoundSql(Object parameterObject) { processingParameterType = parameterType; } - DynamicContext dynamicContext = new DynamicContext(configuration, parameterObject); - Map customVariables = dynamicContext.getBindings(); + Map bindings = new HashMap<>(); + bindings.put(DynamicContext.PARAMETER_OBJECT_KEY, parameterObject); + bindings.put(DynamicContext.DATABASE_ID_KEY, configuration.getDatabaseId()); + + Map customVariables = bindings; customVariables.put(TemporaryTakeoverKeys.CONFIGURATION, configuration); - customVariables.put(TemporaryTakeoverKeys.DYNAMIC_CONTEXT, dynamicContext); + customVariables.put(TemporaryTakeoverKeys.DYNAMIC_CONTEXT, bindings); customVariables.put(TemporaryTakeoverKeys.PROCESSING_PARAMETER_TYPE, processingParameterType); - String sql = sqlGenerator.generate(sqlTemplate, parameterObject, dynamicContext::bind, customVariables); + String sql = sqlGenerator.generate(sqlTemplate, parameterObject, bindings::put, customVariables); - SqlSource sqlSource = sqlSourceBuilder.parse(sql, processingParameterType, dynamicContext.getBindings()); + SqlSource sqlSource = sqlSourceBuilder.parse(sql, processingParameterType, bindings); BoundSql boundSql = sqlSource.getBoundSql(parameterObject); - dynamicContext.getBindings().forEach(boundSql::setAdditionalParameter); + bindings.forEach(boundSql::setAdditionalParameter); return boundSql; } @@ -116,20 +120,20 @@ static class ContextFactory implements BiFunction, I @Override public IContext apply(Object parameter, Map customVariable) { Configuration configuration = (Configuration) customVariable.remove(TemporaryTakeoverKeys.CONFIGURATION); - DynamicContext dynamicContext = (DynamicContext) customVariable.remove(TemporaryTakeoverKeys.DYNAMIC_CONTEXT); + Map bindings = (Map) customVariable.remove(TemporaryTakeoverKeys.DYNAMIC_CONTEXT); Class processingParameterType = (Class) customVariable .remove(TemporaryTakeoverKeys.PROCESSING_PARAMETER_TYPE); MyBatisBindingContext bindingContext = new MyBatisBindingContext( parameter != null && configuration.getTypeHandlerRegistry().hasTypeHandler(processingParameterType)); - dynamicContext.bind(MyBatisBindingContext.CONTEXT_VARIABLE_NAME, bindingContext); + bindings.put(MyBatisBindingContext.CONTEXT_VARIABLE_NAME, bindingContext); IContext context; if (parameter instanceof Map) { @SuppressWarnings(value = "unchecked") Map map = (Map) parameter; - context = new MapBasedContext(map, dynamicContext, configuration.getVariables()); + context = new MapBasedContext(map, bindings, configuration.getVariables()); } else { MetaClass metaClass = MetaClass.forClass(processingParameterType, configuration.getReflectorFactory()); - context = new MetaClassBasedContext(parameter, metaClass, processingParameterType, dynamicContext, + context = new MetaClassBasedContext(parameter, metaClass, processingParameterType, bindings, configuration.getVariables()); } return context; @@ -138,15 +142,15 @@ public IContext apply(Object parameter, Map customVariable) { private abstract static class AbstractContext implements IContext { - private final DynamicContext dynamicContext; + private final Map dynamicContext; private final Properties configurationProperties; private final Set variableNames; - private AbstractContext(DynamicContext dynamicContext, Properties configurationProperties) { + private AbstractContext(Map dynamicContext, Properties configurationProperties) { this.dynamicContext = dynamicContext; this.configurationProperties = configurationProperties; this.variableNames = new HashSet<>(); - addVariableNames(dynamicContext.getBindings().keySet()); + addVariableNames(dynamicContext.keySet()); Optional.ofNullable(configurationProperties).ifPresent(v -> addVariableNames(v.stringPropertyNames())); } @@ -183,8 +187,8 @@ public Set getVariableNames() { */ @Override public Object getVariable(String name) { - if (dynamicContext.getBindings().containsKey(name)) { - return dynamicContext.getBindings().get(name); + if (dynamicContext.containsKey(name)) { + return dynamicContext.get(name); } if (configurationProperties != null && configurationProperties.containsKey(name)) { return configurationProperties.getProperty(name); @@ -200,7 +204,7 @@ private static class MapBasedContext extends AbstractContext { private final Map variables; - private MapBasedContext(Map parameterMap, DynamicContext dynamicContext, + private MapBasedContext(Map parameterMap, Map dynamicContext, Properties configurationProperties) { super(dynamicContext, configurationProperties); this.variables = parameterMap; @@ -224,7 +228,7 @@ private static class MetaClassBasedContext extends AbstractContext { private final Class parameterType; private MetaClassBasedContext(Object parameterObject, MetaClass parameterMetaClass, Class parameterType, - DynamicContext dynamicContext, Properties configurationProperties) { + Map dynamicContext, Properties configurationProperties) { super(dynamicContext, configurationProperties); this.parameterObject = parameterObject; this.parameterMetaClass = parameterMetaClass;