结果映射ResultMap
一.结果映射
是 MyBatis 中最重要最强大的元素,简化代码,允许JDBC不支持的一些操作
1.常用属性
-
constructor - 用于在实例化类时,注入结果到构造方法中 (一般不用)
-
idArg
- ID 参数;标记出作为 ID 的结果可以帮助提高整体性能 -
arg
- 将被注入到构造方法的一个普通结果 -
id
– 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能 -
result
– 注入到字段或 JavaBean 属性的普通结果 -
association – 一个复杂类型的关联;许多结果将包装成这种类型(1对一时)
嵌套结果映射 – 关联可以是 resultMap
元素,或是对其它结果映射的引用
- collection – 一个复杂类型的集合(1对多时)
嵌套结果映射 – 集合可以是 resultMap
元素,或是对其它结果映射的引用
-
discriminator – 使用结果值来决定使用哪个resultMap (一般不用)
case – 基于某些值的结果映射
嵌套结果映射 –
case
也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
2.id和result的属性 - 映射普通类型
属性 | 描述 |
---|---|
property | 映射到列结果的字段或属性。如果用来匹配的 JavaBean 存在给定名字的属性,那么它将会被使用 |
column | 数据库中的列名,或者是列的别名 |
javaType | 一个 Java 类的完全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型 |
jdbcType | JDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。 |
//id每个对象专有的标志
//*id*元素对应的属性会被标记为对象的标识符,在比较对象实例时使用
<resultMap id="deptResultMap" type="dept">//column指定数据库字段名,property实体类中的属性名<id column="dept_id" property="deptId"/><result column="dept_name" property="deptName"/><result column="remark" property="remark"/><collection property="employees" ofType="employee"><id property="emp_id" column="emp_id"/><result property="emp_name" column="emp_name"/><result property="age" column="age"/><result property="sex" column="sex"/><result property="age" column="age"/><result property="dept_id" column="dept_id"/></collection></resultMap>
//deptResultMap与ResultMap标签中的id属性值一致,去掉resultType<select id="queryAll" resultMap="deptResultMap" resultType="emoloyees">select d.dept_id,dept_name,remark,emp_id,emp_name,age,sex,e.dept_idfrom dept dright join employee e on d.dept_id = e.dept_id</select>
当数据库列名和实体类属性名不能匹配上, 使用给变量赋值,就不用在sql语句中给字段名起别名,显示指定
ResultMap
来完成匹配功能
3.关联association
关联映射的是一个对象
1)分类:
MyBatis 有两种不同的方式加载关联:
- 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
- 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
2)常用属性
属性 | 描述 |
---|---|
property | 映射到列结果的字段或属性。如果用来匹配的 JavaBean存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称的字段。 |
javaType | 一个 Java 类的完全限定名,或一个类型别名。如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。 |
column | 数据库中的列名,或者是列的别名,如果需要嵌套查询,用来传参,一般和select一起用 |
select | 嵌套查询时传select的ID,它会从 column属性指定的列中检索数据,作为参数传递给目标 select 语句。 |
resultMap | 结果映射的 ID |
4.集合 - collection
集合映射是一个集合,(1对多)
- 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
- 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
1)常用属性
属性 | 描述 |
---|---|
property | 映射到列结果的字段或属性。 |
javaType | 用来匹配查询结果对应的java类型。一般都是ArrayList |
column | 数据库中的列名,或者是列的别名,如果需要嵌套查询,用来传参,一般和select一起用,随便写个aa也可以 |
select | 嵌套查询时传select的ID,它会从 column属性指定的列中检索数据,作为参数传递给目标 select 语句。 |
resultMap | 结果映射的 ID |
ofType | 映射集合的泛型,即集合里面存放的对象类型 |
<collection property="employees" ofType="employee"><id property="emp_id" column="emp_id"/><result property="emp_name" column="emp_name"/><result property="age" column="age"/><result property="sex" column="sex"/><result property="age" column="age"/><result property="dept_id" column="dept_id"/></collection>
4.关联的分类
1)单向关联(一对1)
单向关联表示关系只在一个方向上存在,其中一个表可以关联到另一个表,但反过来不行。在单向关联中,只有一个表的对象包含了关联对象的引用,而关联对象本身不包含对关联表的引用。
单向关联的配置在MyBatis中非常简单,只需要在<resultMap>中使用<collection>或<association>标签来定义关联即可。
2)双向关联(一对多)
双向关联表示关系在两个表之间是相互关联的,每个表的对象都包含了对另一个表的引用。这样,我们可以通过一个表的对象访问到关联表的对象,也可以通过关联表的对象访问到原始表的对象
双向关联的配置相对复杂一些,需要在<resultMap>中使用<collection>或<association>标签来定义关联,并在关联对象中使用<association>标签来定义反向关联。
需要注意的是,无论是单向关联还是双向关联,都需要在MyBatis的映射文件中进行配置。关联的方向取决于我们在配置时定义的关联属性和关联对象的引用。
总结来说,MyBatis中的关系关联可以是单向关联或双向关联。单向关联表示关系只在一个方向上存在,而双向关联表示关系在两个表之间是相互关联的。在配置关系关联时,我们需要定义关联属性和关联对象的引用,以确定关联的方向。