resultMap的属性:
1.属性
id:resultMap的唯一标识。
type:resulMap的映射结果类型(一般为Java实体类)。
2.子节点
id:一般对应数据库的主键 id,设置此项可以提升数据库性能。
result:映射到JavaBean的某个 “ 简单类型 ” 属性,如基础数据类型,包装类等。子节点 id 和 result 均可以实现最基本的结果集映射,将列映射到简单数据类型的属性。。这两者唯一不同的是:在比较对象实例时 id 将作为结果集的标识属性。这有助于提高总体性能,特别是应用缓存的嵌套结果映射的时候,若需要实现高级结果映射,就需要下面两个配置项:association 和 collection
association(仅处理一对一的关联关系)
1
2
3
4
5
6
7
|
<resultMap type=
"User"
id=
"userRoleResult"
>
<id property=
"id"
column=
"id"
/>
<result property=
"userName"
column=
"userName"
/>
<association property=
"role"
javaType=
"Role"
>
<id property=
"roleName"
column=
"roleName"
/>
</association>
</resultMap>
|
javaType:完整Java类名或者别名。若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,类确保所需行为。此处为Role。
property:映射到数据库列的实体对象的属性,此处为在User实体类里定义的JavaBean对象属性(role)。association的子元素如下:
id。
result。
property:映射到数据库列的实体类对象的属性。此处为Role的属性。
column:数据库列名或者别名。
在做结果映射的过程中,要确保所有的列名都是唯一无歧义的。
collection(属性是一个集合列表)
1
2
3
4
5
6
7
8
|
<resultMap type=
"User"
id=
"userRoleResult"
>
<id property=
"id"
column=
"id"
/>
<result property=
"userName"
column=
"userName"
/>
<collection property=
"List"
ofType=
"Address"
>
<id property=
"id"
column=
"id"
/>
<result property=
"postCode"
column=
"postCode"
/>
</collection>
</resultMap>
|
ofType:完整Java类名或者别名,即集合所包含的类型,此处为Address。
property:映射数据库列的实体类对象的属性。此处为在User里定义的属性:List(可以理解为一个名为List,元素类型为Address的ArrayList集合)
collection的子元素与association基本一致。
一对多
1
|
<span style=
"color: #ff0000;"
><strong><span style=
"font-size: 18pt;"
>实体</span></strong></span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package
com.smbms.entity;
import
java.math.BigInteger;
import
java.util.Date;
import
java.util.List;
/** * 角色 */
<br><br>
public
class
SmbmsRole {
private
Integer rid;
private
String roleCode;
private
String roleName;
private
BigInteger createdBy;
private
Date creationDate;
private
BigInteger modifyBy;
private
Date modifyDate;
//植入多的一方 集合
private
List<SmbmsUser> userList;
public
List<SmbmsUser> getUserList() {
return
userList;
}
public
void
setUserList(List<SmbmsUser> userList) {
this
.userList = userList;
}
public
Integer getRid() {
return
rid;
}
public
void
setRid(Integer rid) {
this
.rid = rid;
}
public
String getRoleCode() {
return
roleCode;
}
public
void
setRoleCode(String roleCode) {
this
.roleCode = roleCode;
}
public
String getRoleName() {
return
roleName;
}
public
void
setRoleName(String roleName) {
this
.roleName = roleName;
}
public
BigInteger getCreatedBy() {
return
createdBy;
}
public
void
setCreatedBy(BigInteger createdBy) {
this
.createdBy = createdBy;
}
public
Date getCreationDate() {
return
creationDate;
}
public
void
setCreationDate(Date creationDate) {
this
.creationDate = creationDate;
}
public
BigInteger getModifyBy() {
return
modifyBy;
}
public
void
setModifyBy(BigInteger modifyBy) {
this
.modifyBy = modifyBy;
}
public
Date getModifyDate() {
return
modifyDate;
}
public
void
setModifyDate(Date modifyDate) {
this
.modifyDate = modifyDate;
}
}
|
DAO层
1
2
3
4
5
6
7
8
9
10
|
<br>
package
com.smbms.dao;
import
com.smbms.entity.SmbmsUser;
import
java.util.List;
public
interface
ISmbmsUserDao {
//查询所有用户信息 包含角色信息
public
List<SmbmsUser> getUserList();
}
|
DAO层XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!DOCTYPE mapper
PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
<!--namespace需要指向接口全路径-->
<mapper namespace=
"com.smbms.dao.ISmbmsRoleDao"
>
<resultMap id=
"roleAndUserMapper"
type=
"SmbmsRole"
>
<id column=
"rid"
property=
"rid"
></id>
<result column=
"roleName"
property=
"roleName"
/>
<!--映射多的一方 property代表实体当中多的一方的属性名 ofType代表集合当中泛型类型-->
<!-- select 代表执行查询的ID column所引用的条件列 -->
<collection property=
"userList"
ofType=
"SmbmsUser"
select=
"getRoleAndUserMutilSQL"
column=
"rid"
>
</collection>
</resultMap>
<!--写成一条sql-->
<select id=
"getRoleAndUser"
resultMap=
"roleAndUserMapper"
>
select u.id,u.userName,u.userRole,r.rid,r.roleName from smbms_user as u,smbms_role as r where u.userRole=r.rid and r.rid=#{id}
</select>
<!--写成两条sql-->
<select id=
"getRoleAndUser"
resultMap=
"roleAndUserMapper"
>
select * from smbms_role where rid=#{id}
</select>
<select id=
"getRoleAndUserMutilSQL"
resultType=
"SmbmsUser"
>
select * from smbms_user where userRole=#{rid}
</select>
</mapper>
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
com.smbms.test;
import
com.smbms.dao.ISmbmsRoleDao;
import
com.smbms.entity.SmbmsRole;
import
com.smbms.entity.SmbmsUser;
import
com.smbms.util.MybatisUtil;
import
org.apache.ibatis.session.SqlSession;
import
org.junit.Test;
public
class
CollectionTest {
@Test
public
void
getRoleAndUserTest(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
ISmbmsRoleDao mapper = sqlSession.getMapper(ISmbmsRoleDao.
class
);
SmbmsRole role = mapper.getRoleAndUser(
3
);
System.out.println(
"角色:"
+role.getRoleName());
for
(SmbmsUser user : role.getUserList()){
System.out.print(
"\t用户:"
+user.getUserName());
}
}
}
|
多对一
1
|
<span style=
"color: #ff0000;"
><strong><span style=
"font-size: 18pt;"
>实体</span></strong></span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
package
com.smbms.entity;
import
java.math.BigInteger;
import
java.util.Date;
/**
*
*/
public
class
SmbmsUser {
private
Integer id;
private
String userCode;
private
String userName;
private
String userPassword;
private
Integer gender;
private
Date birthday;
private
String phone;
private
String address;
private
Integer userRole;
private
BigInteger createdBy;
private
Date creationDate;
private
BigInteger modifyBy;
private
Date modifyDate;
//关联一的一方
private
SmbmsRole role;
public
SmbmsRole getRole() {
return
role;
}
public
void
setRole(SmbmsRole role) {
this
.role = role;
}
public
Integer getId() {
return
id;
}
public
void
setId(Integer id) {
this
.id = id;
}
public
String getUserCode() {
return
userCode;
}
public
void
setUserCode(String userCode) {
this
.userCode = userCode;
}
public
String getUserName() {
return
userName;
}
public
void
setUserName(String userName) {
this
.userName = userName;
}
public
String getUserPassword() {
return
userPassword;
}
public
void
setUserPassword(String userPassword) {
this
.userPassword = userPassword;
}
public
Integer getGender() {
return
gender;
}
public
void
setGender(Integer gender) {
this
.gender = gender;
}
public
Date getBirthday() {
return
birthday;
}
public
void
setBirthday(Date birthday) {
this
.birthday = birthday;
}
public
String getPhone() {
return
phone;
}
public
void
setPhone(String phone) {
this
.phone = phone;
}
public
String getAddress() {
return
address;
}
public
void
setAddress(String address) {
this
.address = address;
}
public
Integer getUserRole() {
return
userRole;
}
public
void
setUserRole(Integer userRole) {
this
.userRole = userRole;
}
public
BigInteger getCreatedBy() {
return
createdBy;
}
public
void
setCreatedBy(BigInteger createdBy) {
this
.createdBy = createdBy;
}
public
Date getCreationDate() {
return
creationDate;
}
public
void
setCreationDate(Date creationDate) {
this
.creationDate = creationDate;
}
public
BigInteger getModifyBy() {
return
modifyBy;
}
public
void
setModifyBy(BigInteger modifyBy) {
this
.modifyBy = modifyBy;
}
public
Date getModifyDate() {
return
modifyDate;
}
public
void
setModifyDate(Date modifyDate) {
this
.modifyDate = modifyDate;
}
}<br><br><br><br><br><br><br>
|
DAO层
1
2
3
4
5
6
7
8
9
10
|
package
com.smbms.dao;
import
com.smbms.entity.SmbmsUser;
import
java.util.List;
public
interface
ISmbmsUserDao {
//查询所有用户信息 包含角色信息
public
List<SmbmsUser> getUserList();
}
|
DAO层XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!DOCTYPE mapper
PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
<!--namespace需要指向接口全路径-->
<mapper namespace=
"com.smbms.dao.ISmbmsUserDao"
>
<resultMap id=
"userListAndRole"
type=
"SmbmsUser"
>
<id column=
"id"
property=
"id"
></id>
<result column=
"userName"
property=
"userName"
/>
<association property=
"role"
javaType=
"SmbmsRole"
select=
"getRole"
column=
"userRole"
>
<id column=
"rid"
property=
"rid"
></id>
<result column=
"roleName"
property=
"roleName"
/>
</association>
</resultMap>
<!--<select id=
"getUserList"
resultMap=
"userListAndRole"
>
select u.id,u.userName,u.userRole,r.rid,r.roleName from smbms_user as u,smbms_role as r where u.userRole=r.rid
</select>-->
<select id=
"getUserList"
resultMap=
"userListAndRole"
>
select * from smbms_user
</select>
<select id=
"getRole"
resultType=
"SmbmsRole"
>
select * from smbms_role where rid=#{userRole}
</select>
</mapper>
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
com.smbms.test;
import
com.smbms.dao.ISmbmsUserDao;
import
com.smbms.entity.SmbmsUser;
import
com.smbms.util.MybatisUtil;
import
org.apache.ibatis.session.SqlSession;
import
org.junit.Test;
import
java.util.List;
public
class
AssociationTest {
@Test
public
void
getUserListTest(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
ISmbmsUserDao mapper = sqlSession.getMapper(ISmbmsUserDao.
class
);
List<SmbmsUser> userList = mapper.getUserList();
for
(SmbmsUser user:userList){
System.out.println(
"用户:"
+user.getUserName()+
"\t角色:"
+user.getRole().getRoleName());
}
}
}
|
多对多
1
|
<span style=
"color: #ff0000;"
><strong><span style=
"font-size: 18pt;"
>实体</span></strong></span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
package
com.smbms.entity;
import
java.util.List;
public
class
Teacher {
private
Integer tid;
private
String tname;
//植入学员集合,代表一名教员可以教授多名学员
private
List<Student> students;
public
Integer getTid() {
return
tid;
}
public
void
setTid(Integer tid) {
this
.tid = tid;
}
public
String getTname() {
return
tname;
}
public
void
setTname(String tname) {
this
.tname = tname;
}
public
List<Student> getStudents() {
return
students;
}
public
void
setStudents(List<Student> students) {
this
.students = students;
}
}
package
com.smbms.entity;
import
java.util.List;
public
class
Student {
private
Integer stuid;
private
String stuname;
private
String stuaddress;
//植入Teacher集合,代表一名学员可以被多名教员教授
private
List<Teacher> teachers;
public
List<Teacher> getTeachers() {
return
teachers;
}
public
void
setTeachers(List<Teacher> teachers) {
this
.teachers = teachers;
}
public
Integer getStuid() {
return
stuid;
}
public
void
setStuid(Integer stuid) {
this
.stuid = stuid;
}
public
String getStuname() {
return
stuname;
}
public
void
setStuname(String stuname) {
this
.stuname = stuname;
}
public
String getStuaddress() {
return
stuaddress;
}
public
void
setStuaddress(String stuaddress) {
this
.stuaddress = stuaddress;
}
}
|
DAO层
1
2
3
4
5
6
7
8
9
10
|
package
com.smbms.dao;
import
com.smbms.entity.Student;
import
java.util.List;
public
interface
IStudentDao {
//查询所有学生信息 以及授课教员
public
List<Student> getStudentInfo();
}
|
DAO层XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!DOCTYPE mapper
PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
<!--namespace需要指向接口全路径-->
<mapper namespace=
"com.smbms.dao.IStudentDao"
>
<resultMap id=
"studentAndTeacherMapper"
type=
"Student"
>
<id column=
"stuid"
property=
"stuid"
/>
<result column=
"stuname"
property=
"stuname"
/>
<collection property=
"teachers"
ofType=
"Teacher"
>
<id column=
"tid"
property=
"tid"
></id>
<result property=
"tname"
column=
"tname"
/>
</collection>
</resultMap>
<select id=
"getStudentInfo"
resultMap=
"studentAndTeacherMapper"
>
select * from student,teacher,stu_t where student.stuid=stu_t.stuid and teacher.tid=stu_t.tid
</select>
</mapper>
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package
com.smbms.test;
import
com.smbms.dao.IStudentDao;
import
com.smbms.entity.Student;
import
com.smbms.entity.Teacher;
import
com.smbms.util.MybatisUtil;
import
org.apache.ibatis.session.SqlSession;
import
org.junit.Test;
import
java.util.List;
public
class
ManeyTooManey {
@Test
public
void
getStudentInfo(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
IStudentDao mapper = sqlSession.getMapper(IStudentDao.
class
);
List<Student> studentInfo = mapper.getStudentInfo();
for
(Student stu:studentInfo){
System.out.println(
"学生:"
+stu.getStuname());
for
(Teacher teacher:stu.getTeachers()){
System.out.print(
"\t教员:"
+teacher.getTname());
}
System.out.println();
}
}
}
|
自联接
1
|
<span style=
"color: #ff0000;"
><strong><span style=
"font-size: 18pt;"
>实体</span></strong></span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package
com.smbms.entity;
import
java.util.List;
public
class
City {
private
Integer cid;
private
String cname;
private
Integer pid;
//自关联集合 代表的是当前City对象的子集集合
public
List<City> childCitys;
@Override
public
String toString() {
return
"City{"
+
"cid="
+ cid +
", cname='"
+ cname + '\
''
+
", pid="
+ pid +
", childCitys="
+ childCitys +
'}'
;
}
public
List<City> getChildCitys() {
return
childCitys;
}
public
void
setChildCitys(List<City> childCitys) {
this
.childCitys = childCitys;
}
public
Integer getCid() {
return
cid;
}
public
void
setCid(Integer cid) {
this
.cid = cid;
}
public
String getCname() {
return
cname;
}
public
void
setCname(String cname) {
this
.cname = cname;
}
public
Integer getPid() {
return
pid;
}
public
void
setPid(Integer pid) {
this
.pid = pid;
}
}
|
DAO层
1
2
3
4
5
6
7
8
9
10
|
package
com.smbms.dao;
import
com.smbms.entity.City;
import
java.util.List;
public
interface
ICityDao {
//查询河南省 下的所有子集
public
City getCityAndChildCitys(Integer cid);
}
|
DAO层XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!DOCTYPE mapper
PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
<!--namespace需要指向接口全路径-->
<mapper namespace=
"com.smbms.dao.ICityDao"
>
<resultMap id=
"CityAndChildCitysMapper"
type=
"City"
>
<id column=
"cid"
property=
"cid"
></id>
<result column=
"cname"
property=
"cname"
/>
<result column=
"pid"
property=
"pid"
/>
<collection property=
"childCitys"
ofType=
"City"
select=
"getCityAndChildCitysMutilSQL"
column=
"cid"
>
<id column=
"cid"
property=
"cid"
></id>
<result column=
"cname"
property=
"cname"
/>
<result column=
"pid"
property=
"pid"
/>
</collection>
</resultMap>
<select id=
"getCityAndChildCitys"
resultMap=
"CityAndChildCitysMapper"
>
select * from city where cid=#{cid}
</select>
<select id=
"getCityAndChildCitysMutilSQL"
resultMap=
"CityAndChildCitysMapper"
>
select * from city where pid=#{cid}
</select>
</mapper>
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package
com.smbms.test;
import
com.smbms.dao.ICityDao;
import
com.smbms.entity.City;
import
com.smbms.util.MybatisUtil;
import
org.apache.ibatis.session.SqlSession;
import
org.junit.Test;
public
class
DGTest {
@Test
public
void
getCityAndChildCitysTest(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
ICityDao mapper = sqlSession.getMapper(ICityDao.
class
);
City city = mapper.getCityAndChildCitys(
410000
);
System.out.println(city.toString());
}
}
|