From c151ce4dbfd734b13964137aa555c0b6f07987f1 Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Fri, 14 Jul 2017 01:30:08 +0900 Subject: [PATCH] Support child nodes on bind element --- .../ibatis/builder/xml/mybatis-3-mapper.dtd | 4 +- .../scripting/xmltags/DynamicContext.java | 9 ++++- .../scripting/xmltags/VarBindSqlNode.java | 40 +++++++++++++++++++ .../scripting/xmltags/XMLScriptBuilder.java | 13 +++++- .../ibatis/submitted/dynsql/DynSqlMapper.java | 4 +- .../ibatis/submitted/dynsql/DynSqlMapper.xml | 23 ++++++++++- .../ibatis/submitted/dynsql/DynSqlTest.java | 29 +++++++++++++- .../dynsql/InvalidBindSqlMapper.java | 20 ++++++++++ .../submitted/dynsql/InvalidBindSqlMapper.xml | 30 ++++++++++++++ 9 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/apache/ibatis/scripting/xmltags/VarBindSqlNode.java create mode 100644 src/test/java/org/apache/ibatis/submitted/dynsql/InvalidBindSqlMapper.java create mode 100644 src/test/java/org/apache/ibatis/submitted/dynsql/InvalidBindSqlMapper.xml diff --git a/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd b/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd index 13bab9fabe2..c5d1212882f 100755 --- a/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd +++ b/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd @@ -243,10 +243,10 @@ lang CDATA #IMPLIED refid CDATA #REQUIRED > - + diff --git a/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java b/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java index aa3c874ff77..fb6ade1eb38 100644 --- a/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java +++ b/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java @@ -1,5 +1,5 @@ /** - * Copyright 2009-2015 the original author or authors. + * Copyright 2009-2017 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. @@ -53,6 +53,13 @@ public DynamicContext(Configuration configuration, Object parameterObject) { bindings.put(DATABASE_ID_KEY, configuration.getDatabaseId()); } + /** + * @since 3.4.5 + */ + public DynamicContext(DynamicContext source) { + this.bindings = source.bindings; + } + public Map getBindings() { return bindings; } diff --git a/src/main/java/org/apache/ibatis/scripting/xmltags/VarBindSqlNode.java b/src/main/java/org/apache/ibatis/scripting/xmltags/VarBindSqlNode.java new file mode 100644 index 00000000000..ac22e27853a --- /dev/null +++ b/src/main/java/org/apache/ibatis/scripting/xmltags/VarBindSqlNode.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.scripting.xmltags; + +/** + * @author Kazuki Shimizu + * @since 3.4.5 + */ +public class VarBindSqlNode implements SqlNode { + + private final String name; + private final SqlNode contents; + + public VarBindSqlNode(String name, SqlNode contents) { + this.name = name; + this.contents = contents; + } + + @Override + public boolean apply(DynamicContext context) { + DynamicContext subContext = new DynamicContext(context); + contents.apply(subContext); + context.bind(name, subContext.getSql()); + return true; + } + +} diff --git a/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java b/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java index 8496b8476c6..2df6850297b 100644 --- a/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java +++ b/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java @@ -24,6 +24,7 @@ import org.apache.ibatis.builder.BuilderException; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.scripting.ScriptingException; import org.apache.ibatis.scripting.defaults.RawSqlSource; import org.apache.ibatis.session.Configuration; import org.w3c.dom.Node; @@ -114,7 +115,17 @@ public BindHandler() { public void handleNode(XNode nodeToHandle, List targetContents) { final String name = nodeToHandle.getStringAttribute("name"); final String expression = nodeToHandle.getStringAttribute("value"); - final VarDeclSqlNode node = new VarDeclSqlNode(name, expression); + if (expression != null && nodeToHandle.getNode().getChildNodes().getLength() > 0) { + throw new ScriptingException("Not support to specify value attribute and body with together on bind element."); + } + final SqlNode node; + if (expression != null) { + node = new VarDeclSqlNode(name, expression); + } else { + final List contents = parseDynamicTags(nodeToHandle); + final MixedSqlNode mixedSqlNode = new MixedSqlNode(contents); + node = new VarBindSqlNode(name, mixedSqlNode); + } targetContents.add(node); } } diff --git a/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.java b/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.java index c22a743d2b2..2ceaed40c8d 100644 --- a/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.java +++ b/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.java @@ -1,5 +1,5 @@ /** - * Copyright 2009-2015 the original author or authors. + * Copyright 2009-2017 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. @@ -19,4 +19,6 @@ public interface DynSqlMapper { String selectDescription(@Param("p") String p); + + String selectDescriptionById(@Param("id") Integer id); } diff --git a/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.xml b/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.xml index 825558aca25..29869f7051e 100644 --- a/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.xml +++ b/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.xml @@ -1,7 +1,7 @@ + + + + + + \ No newline at end of file