假設每一個學生都有一名指導老師,本示例的任務就是查詢出學生的詳細信息,這就包括學生的指導老師的信息。具體代碼以下:java
一、表的結構sql
?數據庫
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
|
DROP
TABLE
IF EXISTS `student`;
CREATE
TABLE
`student` (
`id`
int
(11)
NOT
NULL
auto_increment,
`
name
`
varchar
(10)
NOT
NULL
,
`gender`
char
(1)
NOT
NULL
,
`major`
varchar
(20)
NOT
NULL
,
`grade`
char
(4)
NOT
NULL
,
`supervisor_id`
int
(11)
NOT
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT
INTO
`student`
VALUES
(
'1'
,
'李林'
,
'男'
,
'計算機科學與技術'
,
'2011'
,
'1'
);
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP
TABLE
IF EXISTS `teacher`;
CREATE
TABLE
`teacher` (
`id`
int
(11)
NOT
NULL
auto_increment,
`
name
`
varchar
(10)
NOT
NULL
,
`gender`
char
(1)
NOT
NULL
,
`research_area`
varchar
(20)
NOT
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT
INTO
`teacher`
VALUES
(
'1'
,
'張偉'
,
'男'
,
'軟件工程'
);
|
二、對應的JavaBean類session
?mybatis
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
|
public
class
Student {
private
int
id;
private
String name;
// 姓名
private
String gender;
// 性別
private
String major;
// 專業
private
String grade;
// 年級
private
Teacher supervisor;
//指導教師
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getGender() {
return
gender;
}
public
void
setGender(String gender) {
this
.gender = gender;
}
public
String getMajor() {
return
major;
}
public
void
setMajor(String major) {
this
.major = major;
}
public
String getGrade() {
return
grade;
}
public
void
setGrade(String grade) {
this
.grade = grade;
}
public
Teacher getSupervisor() {
return
supervisor;
}
public
void
setSupervisor(Teacher supervisor) {
this
.supervisor = supervisor;
}
}
public
class
Teacher {
private
int
id;
private
String name;
// 教師姓名
private
String gender;
// 教師性別
private
String researchArea;
// 研究領域
private
List<Student> supStudents;
// 指導學生
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getGender() {
return
gender;
}
public
void
setGender(String gender) {
this
.gender = gender;
}
public
String getResearchArea() {
return
researchArea;
}
public
void
setResearchArea(String researchArea) {
this
.researchArea = researchArea;
}
public
List<Student> getSupStudents() {
return
supStudents;
}
public
void
setSupStudents(List<Student> supStudents) {
this
.supStudents = supStudents;
}
}
|
三、配置StudentMapper.xmlapp
?測試
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
|
<?
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">
<
mapper
namespace
=
"org.zsm.myBatis.day02.inner.IStudentOperation"
>
<!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
<
resultMap
type
=
"Student"
id
=
"studentResultMap"
>
<
id
column
=
"id"
property
=
"id"
/>
<
result
column
=
"name"
property
=
"name"
/>
<
result
column
=
"gender"
property
=
"gender"
/>
<
result
column
=
"major"
property
=
"major"
/>
<
result
column
=
"grade"
property
=
"grade"
/>
<!-- association處理has-a關係 -->
<!--注意:這種方式javaType必須指定,表示supervisor的類型是Teacher,不然會報錯 -->
<
association
property
=
"supervisor"
javaType
=
"Teacher"
>
<!-- 教師自身的屬性與數據庫字段的映射 -->
<
id
property
=
"id"
column
=
"t_id"
/>
<
result
property
=
"name"
column
=
"t_name"
/>
<
result
property
=
"gender"
column
=
"t_gender"
/>
<
result
property
=
"researchArea"
column
=
"research_area"
/>
</
association
>
</
resultMap
>
<!-- SQL語句中以"#{}"的形式引用參數 -->
<
select
id
=
"getById"
parameterType
=
"int"
resultMap
=
"studentResultMap"
>
SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
t.gender t_gender,t.research_area
FROM student st, teacher t
WHERE st.supervisor_id = t.id
AND st.id=#{id}
</
select
>
</
mapper
>
|
三、測試this
?spa
1
2
3
4
5
6
|
public
void
testAssociation(){
SqlSession session = sqlSessionFactory.openSession();
IStudentOperation studentOperation = session.getMapper(IStudentOperation.
class
);
Student student = studentOperation.getById(
1
);
System.out.println(student.getName()+
"的指導老師是:"
+student.getSupervisor().getName());
}
|
myBatis association的兩種形式.net
1、嵌套的resultMap
這種方法的本質就是把教師實體映射從association元素中提取出來,用一個resultMap元素表示。而後association元素再引用這個resultMap元素。
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
|
<?
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">
<
mapper
namespace
=
"org.zsm.myBatis.day02.inner.IStudentOperation"
>
<!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
<
resultMap
type
=
"Teacher"
id
=
"teacherResultMap"
>
<
id
property
=
"id"
column
=
"t_id"
/>
<
result
property
=
"name"
column
=
"t_name"
/>
<
result
property
=
"gender"
column
=
"t_gender"
/>
<
result
property
=
"researchArea"
column
=
"research_area"
/>
</
resultMap
>
<
resultMap
type
=
"Student"
id
=
"studentResultMap"
>
<
id
column
=
"id"
property
=
"id"
/>
<
result
column
=
"name"
property
=
"name"
/>
<
result
column
=
"gender"
property
=
"gender"
/>
<
result
column
=
"major"
property
=
"major"
/>
<
result
column
=
"grade"
property
=
"grade"
/>
<!-- 引用teacherResultMap -->
<
association
property
=
"supervisor"
resultMap
=
"teacherResultMap"
/>
</
resultMap
>
<!-- SQL語句中以"#{}"的形式引用參數 -->
<
select
id
=
"getById"
parameterType
=
"int"
resultMap
=
"studentResultMap"
>
SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
t.gender t_gender,t.research_area
FROM student st, teacher t
WHERE st.supervisor_id = t.id
AND st.id=#{id}
</
select
>
</
mapper
>
|
2、嵌套的select語句
這種方式是使用一條單獨的select語句來加載關聯的實體(本例中就是教師實體),而後在association元素中引用此select語句(注:此方法會產生N+1問題,儘可能不要用嵌套的select語句)
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
|
<?
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">
<
mapper
namespace
=
"org.zsm.myBatis.day02.inner.IStudentOperation"
>
<!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
<
resultMap
type
=
"Teacher"
id
=
"supervisorResultMap"
>
<
id
property
=
"id"
column
=
"t_id"
/>
<
result
property
=
"name"
column
=
"t_name"
/>
<
result
property
=
"gender"
column
=
"t_gender"
/>
<
result
property
=
"researchArea"
column
=
"research_area"
/>
</
resultMap
>
<
resultMap
type
=
"Student"
id
=
"studentResultMap"
>
<
id
column
=
"id"
property
=
"id"
/>
<
result
column
=
"name"
property
=
"name"
/>
<
result
column
=
"gender"
property
=
"gender"
/>
<
result
column
=
"major"
property
=
"major"
/>
<
result
column
=
"grade"
property
=
"grade"
/>
<!-- 引用teacherResultMap -->
<
association
property
=
"supervisor"
column
=
"supervisor_id"
select
=
"selectSupervisor"
/>
</
resultMap
>
<!-- SQL語句中以"#{}"的形式引用參數 -->
<
select
id
=
"getById"
parameterType
=
"int"
resultMap
=
"studentResultMap"
>
select id,name,gender,major,grade,supervisor_id from student where id =#{id}
</
select
>
<
select
id
=
"selectSupervisor"
parameterType
=
"int"
resultMap
=
"supervisorResultMap"
>
select id,name,gender,research_area
from teacher where id = #{id}
</
select
>
</
mapper
>
|