Skip to content

Commit 0670c3e

Browse files
committed
@one and @many add columnPrefix
1 parent c7c810a commit 0670c3e

File tree

11 files changed

+375
-2
lines changed

11 files changed

+375
-2
lines changed

src/main/java/org/apache/ibatis/annotations/Many.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
@Retention(RetentionPolicy.RUNTIME)
3434
@Target({})
3535
public @interface Many {
36+
/**
37+
* Returns the columnPrefix.
38+
*
39+
* @return the columnPrefix.
40+
*/
41+
String columnPrefix() default "";
42+
3643
/**
3744
* Returns the result map id used to map collection.
3845
*

src/main/java/org/apache/ibatis/annotations/One.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
@Retention(RetentionPolicy.RUNTIME)
3434
@Target({})
3535
public @interface One {
36+
/**
37+
* Returns the columnPrefix.
38+
*
39+
* @return the columnPrefix.
40+
*/
41+
String columnPrefix() default "";
42+
3643
/**
3744
* Returns the result map id used to map single object.
3845
*

src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,16 +545,17 @@ private void applyResults(Result[] results, Class<?> resultType, List<ResultMapp
545545
@SuppressWarnings("unchecked")
546546
Class<? extends TypeHandler<?>> typeHandler = (Class<? extends TypeHandler<?>>)
547547
((result.typeHandler() == UnknownTypeHandler.class) ? null : result.typeHandler());
548+
boolean hasNestedResultMap = hasNestedResultMap(result);
548549
ResultMapping resultMapping = assistant.buildResultMapping(
549550
resultType,
550551
nullOrEmpty(result.property()),
551552
nullOrEmpty(result.column()),
552553
result.javaType() == void.class ? null : result.javaType(),
553554
result.jdbcType() == JdbcType.UNDEFINED ? null : result.jdbcType(),
554555
hasNestedSelect(result) ? nestedSelectId(result) : null,
555-
hasNestedResultMap(result) ? nestedResultMapId(result) : null,
556-
null,
556+
hasNestedResultMap ? nestedResultMapId(result) : null,
557557
null,
558+
hasNestedResultMap ? findColumnPrefix(result) : null,
558559
typeHandler,
559560
flags,
560561
null,
@@ -564,6 +565,14 @@ private void applyResults(Result[] results, Class<?> resultType, List<ResultMapp
564565
}
565566
}
566567

568+
private String findColumnPrefix(Result result) {
569+
String columnPrefix = result.one().columnPrefix();
570+
if (columnPrefix.length() < 1) {
571+
columnPrefix = result.many().columnPrefix();
572+
}
573+
return columnPrefix;
574+
}
575+
567576
private String nestedResultMapId(Result result) {
568577
String resultMapId = result.one().resultMap();
569578
if (resultMapId.length() < 1) {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
--
2+
-- Copyright 2009-2019 the original author or authors.
3+
--
4+
-- Licensed under the Apache License, Version 2.0 (the "License");
5+
-- you may not use this file except in compliance with the License.
6+
-- You may obtain a copy of the License at
7+
--
8+
-- http://www.apache.org/licenses/LICENSE-2.0
9+
--
10+
-- Unless required by applicable law or agreed to in writing, software
11+
-- distributed under the License is distributed on an "AS IS" BASIS,
12+
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
-- See the License for the specific language governing permissions and
14+
-- limitations under the License.
15+
--
16+
17+
-- ----------------------------
18+
-- Table structure for role
19+
-- ----------------------------
20+
CREATE TABLE role (
21+
id int,
22+
role_name varchar(10)
23+
);
24+
25+
-- ----------------------------
26+
-- Records of role
27+
-- ----------------------------
28+
INSERT INTO role (id,role_name)
29+
VALUES ('1', 'teacher');
30+
INSERT INTO role (id,role_name)
31+
VALUES ('2', 'student');
32+
INSERT INTO role (id,role_name)
33+
VALUES ('3', 'Headmaster');
34+
INSERT INTO role (id,role_name)
35+
VALUES ('4', 'Learning-commissary');
36+
37+
CREATE TABLE user (
38+
id int,
39+
username varchar(32),
40+
);
41+
42+
-- ----------------------------
43+
-- Records of user
44+
-- ----------------------------
45+
INSERT INTO user (id,username)
46+
VALUES ('1', 'James Gosling');
47+
INSERT INTO user (id,username)
48+
VALUES ('2', 'Doug Lea');
49+
INSERT INTO user (id,username)
50+
VALUES ('3', 'Rod johnson');
51+
INSERT INTO user (id,username)
52+
VALUES ('4', 'Juergen Hoeller');
53+
54+
-- ----------------------------
55+
-- Table structure for `user_role`
56+
-- ----------------------------
57+
CREATE TABLE user_role (
58+
id int,
59+
role_id int,
60+
user_id int
61+
);
62+
63+
-- ----------------------------
64+
-- Records of user_role
65+
-- ----------------------------
66+
INSERT INTO user_role (id,role_id,user_id)
67+
VALUES ('1', '2', '4');
68+
INSERT INTO user_role (id,role_id,user_id)
69+
VALUES ('2', '3', '1');
70+
INSERT INTO user_role (id,role_id,user_id)
71+
VALUES ('3', '1', '2');
72+
INSERT INTO user_role (id,role_id,user_id)
73+
VALUES ('4', '2', '3');
74+
INSERT INTO user_role (id,role_id,user_id)
75+
VALUES ('5', '4', '4');
76+
INSERT INTO user_role (id,role_id,user_id)
77+
VALUES ('6', '1', '1');
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.apache.ibatis.submitted.annotion_many_one_add_columnprefix;
2+
3+
import org.apache.ibatis.BaseDataTest;
4+
import org.apache.ibatis.io.Resources;
5+
import org.apache.ibatis.session.SqlSession;
6+
import org.apache.ibatis.session.SqlSessionFactory;
7+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
8+
import org.junit.jupiter.api.BeforeAll;
9+
import org.junit.jupiter.api.Test;
10+
11+
import static org.junit.jupiter.api.Assertions.*;
12+
13+
import java.io.Reader;
14+
import java.util.List;
15+
16+
class OneManyResultMapTest {
17+
18+
private static SqlSessionFactory sqlSessionFactory;
19+
20+
@BeforeAll
21+
static void setUp() throws Exception {
22+
// create an SqlSessionFactory
23+
try (Reader reader = Resources
24+
.getResourceAsReader("org/apache/ibatis/submitted/annotion_many_one_add_columnprefix/SqlMapConfig.xml")) {
25+
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
26+
}
27+
28+
// populate in-memory database
29+
BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),
30+
"org/apache/ibatis/submitted/annotion_many_one_add_columnprefix/CreateDB.sql");
31+
}
32+
33+
@Test
34+
void shouldUseColumnPrefixWithMany() {
35+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
36+
UserDao mapper = sqlSession.getMapper(UserDao.class);
37+
List<User> users = mapper.findAll();
38+
assertNotNull(users);
39+
assertEquals(4, users.size());
40+
assertEquals(2, users.get(0).getRoles().size());
41+
}
42+
}
43+
44+
@Test
45+
void shouldUseColumnPrefixInXmlWithMany() {
46+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
47+
UserDao mapper = sqlSession.getMapper(UserDao.class);
48+
List<User> users = mapper.findAll2();
49+
assertNotNull(users);
50+
assertEquals(4, users.size());
51+
assertEquals(2, users.get(0).getRoles().size());
52+
}
53+
}
54+
55+
@Test
56+
void shouldUseColumnPrefixWithOne() {
57+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
58+
UserDao mapper = sqlSession.getMapper(UserDao.class);
59+
List<User> users = mapper.findAll3();
60+
assertNotNull(users);
61+
assertEquals(2, users.size());
62+
assertNotNull(users.get(0).getRole());
63+
assertEquals("teacher", users.get(0).getRole().getRoleName());
64+
}
65+
}
66+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.apache.ibatis.submitted.annotion_many_one_add_columnprefix;
2+
3+
public class Role {
4+
private Integer id;
5+
6+
@Override
7+
public String toString() {
8+
return "Role{" +
9+
"id=" + id +
10+
", roleName='" + roleName + '\'' +
11+
'}';
12+
}
13+
14+
private String roleName;
15+
16+
public Integer getId() {
17+
return id;
18+
}
19+
20+
public void setId(Integer id) {
21+
this.id = id;
22+
}
23+
24+
public String getRoleName() {
25+
return roleName;
26+
}
27+
28+
public void setRoleName(String roleName) {
29+
this.roleName = roleName;
30+
}
31+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.apache.ibatis.submitted.annotion_many_one_add_columnprefix;
2+
3+
import org.apache.ibatis.annotations.Result;
4+
import org.apache.ibatis.annotations.Results;
5+
import org.apache.ibatis.annotations.Select;
6+
import org.apache.ibatis.submitted.annotion_many_one_add_resultmapid.Role;
7+
8+
import java.util.List;
9+
10+
/**
11+
* @author lvyang
12+
*/
13+
public interface RoleDao {
14+
@Select("select * from role")
15+
@Results(id = "roleMap1", value = {
16+
@Result(id = true, column = "id", property = "id"),
17+
@Result(column = "name", property = "roleName")
18+
})
19+
public List<Role> findAll();
20+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
~ Copyright (c) 2020 itheima.com All Rights Reserved.FileName: RoleDao.xml@author: lvyang@date: 20-2-6 上午8:38
4+
-->
5+
<!DOCTYPE mapper
6+
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
7+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
8+
<mapper
9+
namespace="org.apache.ibatis.submitted.annotion_many_one_add_columnprefix.RoleDao">
10+
<resultMap id="roleMap2"
11+
type="org.apache.ibatis.submitted.annotion_many_one_add_columnprefix.Role">
12+
<id column="id" property="id" />
13+
<result column="name" property="roleName" />
14+
</resultMap>
15+
</mapper>
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+
~ Copyright (c) 2020 itheima.com All Rights Reserved.FileName: SqlMapConfig.xml@author: lvyang@date: 20-2-6 上午8:37
4+
-->
5+
<!DOCTYPE configuration
6+
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
7+
"http://mybatis.org/dtd/mybatis-3-config.dtd">
8+
<configuration>
9+
<environments default="development">
10+
<environment id="development">
11+
<transactionManager type="JDBC" />
12+
<dataSource type="UNPOOLED">
13+
<property name="driver" value="org.hsqldb.jdbcDriver" />
14+
<property name="url"
15+
value="jdbc:hsqldb:mem:annotion_many_one_add_columnprefix" />
16+
<property name="username" value="sa" />
17+
</dataSource>
18+
</environment>
19+
</environments>
20+
21+
<mappers>
22+
<mapper
23+
class="org.apache.ibatis.submitted.annotion_many_one_add_columnprefix.RoleDao" />
24+
<mapper
25+
class="org.apache.ibatis.submitted.annotion_many_one_add_columnprefix.UserDao" />
26+
</mappers>
27+
</configuration>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.apache.ibatis.submitted.annotion_many_one_add_columnprefix;
2+
3+
import java.util.List;
4+
5+
public class User {
6+
private Integer id;
7+
private String username;
8+
private List<User> teachers;
9+
private Role role;
10+
private List<Role> roles;
11+
12+
public Role getRole() {
13+
return role;
14+
}
15+
16+
public void setRole(Role role) {
17+
this.role = role;
18+
}
19+
20+
@Override
21+
public String toString() {
22+
return "User{" +
23+
"id=" + id +
24+
", username='" + username + '\'' +
25+
", roles=" + roles +
26+
'}';
27+
}
28+
29+
public Integer getId() {
30+
return id;
31+
}
32+
33+
public void setId(Integer id) {
34+
this.id = id;
35+
}
36+
37+
public String getUsername() {
38+
return username;
39+
}
40+
41+
public void setUsername(String username) {
42+
this.username = username;
43+
}
44+
45+
public List<Role> getRoles() {
46+
return roles;
47+
}
48+
49+
public void setRoles(List<Role> roles) {
50+
this.roles = roles;
51+
}
52+
53+
public List<User> getTeachers() {
54+
return teachers;
55+
}
56+
57+
public void setTeachers(List<User> teachers) {
58+
this.teachers = teachers;
59+
}
60+
}

0 commit comments

Comments
 (0)