Skip to content

Commit 6f932f5

Browse files
Throw an IncompleteStatementException when resultMap or parameterMap reference an unloaded mapper.
1 parent f185eb6 commit 6f932f5

13 files changed

+312
-2
lines changed

src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.apache.ibatis.builder;
22

3+
import org.apache.ibatis.builder.xml.IncompleteStatementException;
34
import org.apache.ibatis.cache.Cache;
45
import org.apache.ibatis.cache.decorators.LruCache;
56
import org.apache.ibatis.cache.impl.PerpetualCache;
@@ -244,7 +245,11 @@ private void setStatementParameterMap(
244245
parameterMap = applyCurrentNamespace(parameterMap);
245246

246247
if (parameterMap != null) {
247-
statementBuilder.parameterMap(configuration.getParameterMap(parameterMap));
248+
try {
249+
statementBuilder.parameterMap(configuration.getParameterMap(parameterMap));
250+
} catch (IllegalArgumentException e) {
251+
throw new IncompleteStatementException("Could not find parameter map " + parameterMap, e);
252+
}
248253
} else if (parameterTypeClass != null) {
249254
List<ParameterMapping> parameterMappings = new ArrayList<ParameterMapping>();
250255
ParameterMap.Builder inlineParameterMapBuilder = new ParameterMap.Builder(
@@ -267,7 +272,11 @@ private void setStatementResultMap(
267272
if (resultMap != null) {
268273
String[] resultMapNames = resultMap.split(",");
269274
for (String resultMapName : resultMapNames) {
270-
resultMaps.add(configuration.getResultMap(resultMapName.trim()));
275+
try {
276+
resultMaps.add(configuration.getResultMap(resultMapName.trim()));
277+
} catch (IllegalArgumentException e) {
278+
throw new IncompleteStatementException("Could not find result map " + resultMapName, e);
279+
}
271280
}
272281
} else if (resultType != null) {
273282
ResultMap.Builder inlineResultMapBuilder = new ResultMap.Builder(
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
3+
<!DOCTYPE configuration
4+
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
5+
"http://mybatis.org/dtd/mybatis-3-config.dtd">
6+
7+
<configuration>
8+
9+
<environments default="development">
10+
<environment id="development">
11+
<transactionManager type="JDBC">
12+
<property name="" value=""/>
13+
</transactionManager>
14+
<dataSource type="UNPOOLED">
15+
<property name="driver" value="org.hsqldb.jdbcDriver"/>
16+
<property name="url" value="jdbc:hsqldb:mem:xmlextref"/>
17+
<property name="username" value="sa"/>
18+
</dataSource>
19+
</environment>
20+
</environments>
21+
22+
<mappers>
23+
<mapper resource="org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.xml"/>
24+
<mapper resource="org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.xml"/>
25+
</mappers>
26+
27+
</configuration>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.apache.ibatis.submitted.xml_external_ref;
2+
3+
public interface ParameterMapReferencePersonMapper {
4+
Person select(Person person);
5+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4+
<mapper namespace="org.apache.ibatis.submitted.xml_external_ref.ParameterMapReferencePersonMapper">
5+
<resultMap type="org.apache.ibatis.submitted.xml_external_ref.Person"
6+
id="personResult">
7+
<id property="id" column="person_id" />
8+
<result property="name" column="person_name" />
9+
</resultMap>
10+
<!-- Referencing a parameter map in another file -->
11+
<select id="select" parameterMap="org.apache.ibatis.submitted.xml_external_ref.ParameterMapReferencePetMapper.personParameter" resultMap="personResult">
12+
SELECT person_id, person_name
13+
FROM person
14+
WHERE person_id = ?
15+
</select>
16+
</mapper>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.apache.ibatis.submitted.xml_external_ref;
2+
3+
public interface ParameterMapReferencePetMapper {
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4+
<mapper namespace="org.apache.ibatis.submitted.xml_external_ref.ParameterMapReferencePetMapper">
5+
<parameterMap type="org.apache.ibatis.submitted.xml_external_ref.Person" id="personParameter">
6+
<parameter property="id"/>
7+
</parameterMap>
8+
</mapper>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package org.apache.ibatis.submitted.xml_external_ref;
2+
3+
import static org.junit.Assert.*;
4+
5+
import java.io.IOException;
6+
import java.io.Reader;
7+
import java.sql.Connection;
8+
import java.sql.DriverManager;
9+
import java.sql.SQLException;
10+
11+
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
12+
import org.apache.ibatis.io.Resources;
13+
import org.apache.ibatis.jdbc.ScriptRunner;
14+
import org.apache.ibatis.mapping.Environment;
15+
import org.apache.ibatis.session.Configuration;
16+
import org.apache.ibatis.session.SqlSession;
17+
import org.apache.ibatis.session.SqlSessionFactory;
18+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
19+
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
20+
import org.junit.Test;
21+
22+
public class ParameterMapReferenceTest {
23+
24+
@Test
25+
public void testCrossReferenceXmlConfig() throws Exception {
26+
testCrossReference(getSqlSessionFactoryXmlConfig());
27+
}
28+
29+
@Test
30+
public void testCrossReferenceJavaConfig() throws Exception {
31+
testCrossReference(getSqlSessionFactoryJavaConfig());
32+
}
33+
34+
private void testCrossReference(SqlSessionFactory sqlSessionFactory) throws Exception {
35+
SqlSession sqlSession = sqlSessionFactory.openSession();
36+
try {
37+
ParameterMapReferencePersonMapper personMapper = sqlSession.getMapper(ParameterMapReferencePersonMapper.class);
38+
Person parameter = new Person();
39+
parameter.setId(1);
40+
Person person = personMapper.select(parameter);
41+
assertEquals((Integer)1, person.getId());
42+
43+
} finally {
44+
sqlSession.close();
45+
}
46+
}
47+
48+
private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception {
49+
Reader configReader = Resources
50+
.getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml");
51+
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader);
52+
configReader.close();
53+
54+
Connection conn = sqlSessionFactory.getConfiguration().getEnvironment().getDataSource().getConnection();
55+
initDb(conn);
56+
57+
return sqlSessionFactory;
58+
}
59+
60+
private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception {
61+
Class.forName("org.hsqldb.jdbcDriver");
62+
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:xmlextref", "sa", "");
63+
initDb(c);
64+
65+
Configuration configuration = new Configuration();
66+
Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource(
67+
"org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null));
68+
configuration.setEnvironment(environment);
69+
70+
configuration.addMapper(ParameterMapReferencePersonMapper.class);
71+
configuration.addMapper(ParameterMapReferencePetMapper.class);
72+
73+
return new SqlSessionFactoryBuilder().build(configuration);
74+
}
75+
76+
private static void initDb(Connection conn) throws IOException, SQLException {
77+
try {
78+
Reader scriptReader = Resources.getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql");
79+
ScriptRunner runner = new ScriptRunner(conn);
80+
runner.setLogWriter(null);
81+
runner.setErrorLogWriter(null);
82+
runner.runScript(scriptReader);
83+
conn.commit();
84+
scriptReader.close();
85+
} finally {
86+
if (conn != null) {
87+
conn.close();
88+
}
89+
}
90+
}
91+
92+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
3+
<!DOCTYPE configuration
4+
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
5+
"http://mybatis.org/dtd/mybatis-3-config.dtd">
6+
7+
<configuration>
8+
9+
<environments default="development">
10+
<environment id="development">
11+
<transactionManager type="JDBC">
12+
<property name="" value=""/>
13+
</transactionManager>
14+
<dataSource type="UNPOOLED">
15+
<property name="driver" value="org.hsqldb.jdbcDriver"/>
16+
<property name="url" value="jdbc:hsqldb:mem:xmlextref"/>
17+
<property name="username" value="sa"/>
18+
</dataSource>
19+
</environment>
20+
</environments>
21+
22+
<mappers>
23+
<mapper resource="org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.xml"/>
24+
<mapper resource="org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.xml"/>
25+
</mappers>
26+
27+
</configuration>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.apache.ibatis.submitted.xml_external_ref;
2+
3+
public interface ResultMapReferencePersonMapper {
4+
Pet selectPet(Integer id);
5+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4+
<mapper namespace="org.apache.ibatis.submitted.xml_external_ref.ResultMapReferencePersonMapper">
5+
<!-- Referencing a result map in another file -->
6+
<select id="selectPet" parameterType="java.lang.Integer"
7+
resultMap="org.apache.ibatis.submitted.xml_external_ref.ResultMapReferencePetMapper.petResult">
8+
SELECT pet_id, owner_id, pet_name
9+
FROM pet
10+
WHERE pet_id = #{id}
11+
</select>
12+
</mapper>

0 commit comments

Comments
 (0)