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(); + } + } + +}