myBaits association的使用

假設每一個學生都有一名指導老師,本示例的任務就是查詢出學生的詳細信息,這就包括學生的指導老師的信息。具體代碼以下: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 >
相關文章
相關標籤/搜索