myBaits association的使用

假设每个学生都有一名指导老师,本示例的任务就是查询出学生的详细信息,这就包括学生的指导老师的信息。具体代码如下:

1、表的结构

?

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' '张伟' '男' '软件工程' );

 2、对应的JavaBean类

?

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;
  }
}

3、配置StudentMapper.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
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 >

3、测试

?

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的两种形式

一、嵌套的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 >

二、嵌套的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 >


转载于:https://my.oschina.net/u/2519662/blog/649673

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值