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