文档章节

myBaits association的使用

 看你怎么O
发布于 2016/03/30 09:38
字数 1275
阅读 46
收藏 0

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

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 >


本文转载自:http://my.oschina.net/u/1425545/blog/194647

粉丝 0
博文 58
码字总数 19794
作品 0
深圳
私信 提问

暂无文章

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
8
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3.1K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部