Author: cbegin
Date: Thu Dec 17 04:34:56 2009
New Revision: 891532

URL: http://svn.apache.org/viewvc?rev=891532&view=rev
Log:
ibatis-707 String substitution ${} does not work and produces different errors 
in annotations and xml

Added:
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java
Modified:
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java?rev=891532&r1=891531&r2=891532&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
 Thu Dec 17 04:34:56 2009
@@ -30,12 +30,15 @@
   private List<String> paramNames;
   private List<Integer> paramPositions;
 
+  private boolean hasNamedParameters;
+
   public MapperMethod(Method method, SqlSession sqlSession) {
     paramNames = new ArrayList<String>();
     paramPositions = new ArrayList<Integer>();
     this.sqlSession = sqlSession;
     this.method = method;
     this.config = sqlSession.getConfiguration();
+    this.hasNamedParameters = false;
     setupFields();
     setupMethodSignature();
     setupCommandType();
@@ -83,7 +86,7 @@
     final int paramCount = paramPositions.size();
     if (args == null || paramCount == 0) {
       return null;
-    } else if (paramPositions.size() == 1) {
+    } else if (!hasNamedParameters && paramCount == 1) {
       return args[paramPositions.get(0)];
     } else {
       Map param = new HashMap();
@@ -121,6 +124,7 @@
     Object[] paramAnnos = method.getParameterAnnotations()[i];
     for (int j = 0; j < paramAnnos.length; j++) {
       if (paramAnnos[j] instanceof Param) {
+        hasNamedParameters = true;
         paramName = ((Param) paramAnnos[j]).value();
       }
     }

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java?rev=891532&r1=891531&r2=891532&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
 Thu Dec 17 04:34:56 2009
@@ -6,6 +6,10 @@
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.builder.SqlSourceBuilder;
 import org.apache.ibatis.builder.xml.XMLMapperBuilder;
+import org.apache.ibatis.builder.xml.dynamic.DynamicSqlSource;
+import org.apache.ibatis.builder.xml.dynamic.MixedSqlNode;
+import org.apache.ibatis.builder.xml.dynamic.SqlNode;
+import org.apache.ibatis.builder.xml.dynamic.TextSqlNode;
 import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.NoKeyGenerator;
@@ -248,13 +252,15 @@
         }
         Annotation sqlAnnotation = method.getAnnotation(sqlAnnotationType);
         final String[] strings = (String[]) 
sqlAnnotation.getClass().getMethod("value").invoke(sqlAnnotation);
-        StringBuilder sql = new StringBuilder();
+        final StringBuilder sql = new StringBuilder();
         for (String fragment : strings) {
           sql.append(fragment);
           sql.append(" ");
         }
-        SqlSourceBuilder parser = new 
SqlSourceBuilder(assistant.getConfiguration());
-        return parser.parse(sql.toString(), getParameterType(method));
+        ArrayList<SqlNode> contents = new ArrayList<SqlNode>();
+        contents.add(new TextSqlNode(sql.toString()));
+        MixedSqlNode rootSqlNode = new MixedSqlNode(contents);
+        return new DynamicSqlSource(configuration, rootSqlNode);
       } else if (sqlProviderAnnotationType != null) {
         Annotation sqlProviderAnnotation = 
method.getAnnotation(sqlProviderAnnotationType);
         return new ProviderSqlSource(assistant.getConfiguration(), 
sqlProviderAnnotation);

Added: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql?rev=891532&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql
 (added)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql
 Thu Dec 17 04:34:56 2009
@@ -0,0 +1,14 @@
+create schema ibtest authorization dba;
+
+create table ibtest.names (
+id int,
+firstName varchar(20),
+lastName varchar(20)
+);
+
+insert into ibtest.names (id, firstName, lastName) values(1, 'Fred', 
'Flintstone');
+insert into ibtest.names (id, firstName, lastName) values(2, 'Wilma', 
'Flintstone');
+insert into ibtest.names (id, firstName, lastName) values(3, 'Pebbles', 
'Flintstone');
+insert into ibtest.names (id, firstName, lastName) values(4, 'Barney', 
'Rubble');
+insert into ibtest.names (id, firstName, lastName) values(5, 'Betty', 
'Rubble');
+insert into ibtest.names (id, firstName, lastName) values(6, 'Bamm Bamm', 
'Rubble');

Added: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java?rev=891532&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java
 (added)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java
 Thu Dec 17 04:34:56 2009
@@ -0,0 +1,19 @@
+package org.apache.ibatis.submitted.substitution_in_annots;
+
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+public interface SubstitutionInAnnotsMapper {
+
+       public String getPersonNameByIdWithXml(int id);
+
+       @Select("select firstName from ibtest.names where id=${value}")
+       public String getPersonNameByIdWithAnnotsValue(int id);
+
+       @Select("select firstName from ibtest.names where id=${_parameter}")
+       public String getPersonNameByIdWithAnnotsParameter(int id);
+
+       @Select("select firstName from ibtest.names where id=${named}")
+       public String getPersonNameByIdWithAnnotsParamAnnot(@Param("named") int 
id);
+
+}

Added: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml?rev=891532&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml
 (added)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml
 Thu Dec 17 04:34:56 2009
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" 
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd";>
+<mapper>
+       <select id="getPersonNameByIdWithXml" parameterType="int" 
resultType="String">
+               select firstName from ibtest.names where id=${value}
+       </select>
+
+</mapper>
\ No newline at end of file

Added: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java?rev=891532&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java
 (added)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java
 Thu Dec 17 04:34:56 2009
@@ -0,0 +1,98 @@
+package org.apache.ibatis.submitted.substitution_in_annots;
+
+import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
+import org.apache.ibatis.io.Resources;
+import org.apache.ibatis.jdbc.ScriptRunner;
+import org.apache.ibatis.mapping.Environment;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.session.SqlSessionFactoryBuilder;
+import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.hsqldb.jdbcDriver;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class SubstitutionInAnnotsTest {
+
+  protected static SqlSessionFactory sqlSessionFactory;
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    DriverManager.registerDriver(new jdbcDriver());
+       Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:annots", 
"sa", "");
+       Reader reader = 
Resources.getResourceAsReader("org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql");
+    ScriptRunner runner = new ScriptRunner(c);
+    runner.setLogWriter(null);
+    runner.setErrorLogWriter(new PrintWriter(System.err));
+    runner.runScript(reader);
+    c.commit();
+    reader.close();
+
+    Configuration configuration = new Configuration();
+    Environment environment = new Environment("test", new 
JdbcTransactionFactory(), new UnpooledDataSource(jdbcDriver.class.getName(), 
"jdbc:hsqldb:mem:annots", null));
+    configuration.setEnvironment(environment);
+    
+    configuration.addMapper(SubstitutionInAnnotsMapper.class);
+    
+    sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
+  }
+
+  @Test
+  public void testSubstitutionWithXml() {
+    SqlSession sqlSession = sqlSessionFactory.openSession();
+    try {
+      SubstitutionInAnnotsMapper mapper = 
sqlSession.getMapper(SubstitutionInAnnotsMapper.class);
+      assertEquals("Barney", mapper.getPersonNameByIdWithXml(4));
+    } finally {
+      sqlSession.close();
+    }
+  }
+
+  @Test
+  public void testSubstitutionWithAnnotsValue() {
+    SqlSession sqlSession = sqlSessionFactory.openSession();
+    try {
+      SubstitutionInAnnotsMapper mapper = 
sqlSession.getMapper(SubstitutionInAnnotsMapper.class);
+      assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsValue(4));
+    } finally {
+      sqlSession.close();
+    }
+  }
+  
+  @Test
+  public void testSubstitutionWithAnnotsParameter() {
+    SqlSession sqlSession = sqlSessionFactory.openSession();
+    try {
+      SubstitutionInAnnotsMapper mapper = 
sqlSession.getMapper(SubstitutionInAnnotsMapper.class);
+      assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsParameter(4));
+    } finally {
+      sqlSession.close();
+    }
+  }
+
+  @Test
+  public void testSubstitutionWithAnnotsParamAnnot() {
+    SqlSession sqlSession = sqlSessionFactory.openSession();
+    try {
+      SubstitutionInAnnotsMapper mapper = 
sqlSession.getMapper(SubstitutionInAnnotsMapper.class);
+      assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsParamAnnot(4));
+    } finally {
+      sqlSession.close();
+    }
+  }
+
+}


Reply via email to