MyBatis association的两种形式——MyBatis学习笔记之四

简介:

一、嵌套的resultMap

      这种方法本质上就是上篇博文介绍的方法,只是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后association元素再引用这个resultMap元素。修改上篇博文示例的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
32
33
34
35
36
37
<? xml  version = "1.0"  encoding = "utf8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper  namespace = "com.abc.mapper.StudentMapper" >
< select  id = "getById"  parameterType = "int"  resultMap = "studentResultMap" >
select s.id s_id,
s.name s_name,
s.gender s_gender,
s.major s_major,
s.grade s_grade,
t.id t_id,
t.name t_name,
t.gender t_gender,
t.title t_title,
t.research_area t_research_area
from student s left join teacher t
on s.supervisor_id = t.id
where s.id=#{id}
</ select >
< resultMap  id = "studentResultMap"  type = "Student" >
< id  property = "id"  column = "s_id" />
< result  property = "name"  column = "s_name" />
< result  property = "gender"  column = "s_gender" />
< result  property = "major"   column = "s_major" />
< result  property = "grade"   column = "s_grade" />
<!--使用resultMap属性引用下面的教师实体映射-->
< association  property = "supervisor"  javaType = "Teacher"
resultMap = "supervisorResultMap" />
</ resultMap >
<!--教师实体映射-->
< resultMap  id = "supervisorResultMap"  type = "Teacher" >
< id  property = "id"  column = "t_id" />
< result  property = "name"  column = "t_name" />
< result  property = "gender"  column = "t_gender" />
< result  property = "researchArea"  column = "t_research_area" />
< result  property = "title"  column = "t_title" />
</ resultMap >
</ mapper >

      在这里,为了让select语句更加清晰可读,每个字段都使用了别名。association元素的属性javaType="Teacher"可以不要,不像上篇博文示例那样,没有此属性即报错。这大概是因为引用的resultMap元素已经指明了映射的类型为“Teacher”。另外,今天偶然发现,把StudentMapper.xml的encoding属性由“UTF-8”改为“utf8”即可添加中文注释。

      运行结果如下:

174626218.png

      这种方式的好处是此resultMap元素可在其它地方被重用(可在博文下方附件下载处下载示例源码)。

二、嵌套的select语句

      这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,关于这个问题可参考本系列博客中的“MyBatis中的N+1问题”)。修改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 = "utf8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper  namespace = "com.abc.mapper.StudentMapper" >
< 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,title,research_area
from teacher where id=#{id}
</ select >
< resultMap  id = "studentResultMap"  type = "Student" >
< id  property = "id"  column = "id" />
< result  property = "name"  column = "name" />
< result  property = "gender"  column = "gender" />
< result  property = "major"   column = "major" />
< result  property = "grade"   column = "grade" />
<!--column="supervisor_id"不能少。此列的值作为参数
传递给要引用的select语句,用来查询相应学生的指导教师
的信息。select属性指定要引用的select语句-->
< association  property = "supervisor"  javaType = "Teacher"
column = "supervisor_id"  select = "selectSupervisor" />
</ resultMap >
<!--教师实体映射-->
< resultMap  id = "supervisorResultMap"  type = "Teacher" >
< id  property = "id"  column = "id" />
< result  property = "name"  column = "name" />
< result  property = "gender"  column = "gender" />
< result  property = "researchArea"  column = "research_area" />
< result  property = "title"  column = "title" />
</ resultMap >
</ mapper >

       association元素的属性javaType="Teacher"也可以不要,这大概也是因为引用的select语句中已经指明了要用到的resultMap。

       执行结果如下(可在博文下方附件下载处下载示例源码):

174832937.png










本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/940072,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
Java 数据库连接 mybatis
【Mybatis用法】Mybatis框架中一对一,一对多association和collection的使用举例方法
【Mybatis用法】Mybatis框架中一对一,一对多association和collection的使用举例方法
52 0
|
2月前
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
106 0
|
6月前
|
Java 数据库连接 mybatis
MyBatis中对象映射关联之association使用实践
MyBatis中对象映射关联之association使用实践
211 1
|
4月前
|
SQL XML Java
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
56 0
|
4月前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
|
6月前
|
Java 数据库连接 mybatis
mybatis中的association和collection
mybatis中的association和collection
31 0
|
7月前
|
SQL Java 数据库连接
【Mybatis用法】Mybatis 高级结果映射,ResultMap Association,mybatis的一对多,多对一,以及多对多的配置和使用
【Mybatis用法】Mybatis 高级结果映射,ResultMap Association,mybatis的一对多,多对一,以及多对多的配置和使用
72 0
|
8月前
|
SQL Java 关系型数据库
|
8月前
|
SQL Java 关系型数据库