输出映射:关联嵌套标签association和集合嵌套标签collection

本文介绍了MyBatis中的resultType和resultMap两种输出映射方式,重点讲解了如何通过resultMap进行结果集的关联嵌套(association)和集合嵌套(collection)配置。通过具体的查询包装类、映射配置和测试用例,展示了如何处理复杂查询场景,以满足从多张表中获取组合数据的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

为了配置好这两个标签并实现其功能,从数据库录入数据到持久化实体类创建,SQL映射配置和测试等都手动肝了一遍,虽然有点小累,但配置好,测试正确后,长舒了一口气,想起之前参加华为云开发者沙龙时看到的一句话:“选择不凡”。现在写下这一篇日志,总结一下这两个输出映射标签的使用,以及自己的配置过程。既然两个标签都是在输出映射(resultMap)中配置,在讲这两个标签之前,先来简单回顾MyBatis中的两种输出映射配置,觉得清楚resultType和resultMap的可以跳过这一部分。

输出映射resultType和resultMap

MyBatis中有两种方法把数据库查询返回的结果映射到对应的JavaBean中,一种是resultType标签,它比较简单,负责定义SQL映射语句中的记录返回值的映射类型,例如我们根据学号查询某一个学生的姓名(在数据库中存储为字符串类型),返回值的映射类型resultType=“String”。resultType中可以配置基本数据类型,基本数据类型的包装类(Integer、String、Double等)和我们自己定义的JavaBean。resultType在映射用户自定义的Java类时,有两种情况:

第一,如果返回的记录中,列名和自定义类中的属性名里,至少有一个是一致的,就会创建该类的对象,并把列名的数据映射到对象的相应属性中。

第二种情况,如果返回的记录中,所有的列名和自定义类中的属性都不对应,那么就不会创建自定义类的对象。

resultType支持这么多数据类型的映射,还支持自定义的包装类型,看似足够强大了,但其实还是有一个比较大的缺点,就是resultType映射自定义包装类时,类中的属性名必须和数据库的列名相同,否则,你就无法从返回结果集记录中,把想要的结果映射到类的对象中。在日常维护时,如果想把类中的属性名修改,就不得不一起把数据库中的列名也做修改,反过来也是,这样做工作量大,所以resultType适合于一些简单的,基本数据类型,基本数据包装类或自定义类中,字段名无需任何转换的场景。

如果想解决上面这个问题,可以使用resultMap结果集配置,来自己设定数据库列名和自定义Java实体类中属性的一一映射关系,并设定返回的结果集记录最终生成的Java实体类型。看个例子:

<!-- id属性是resultMap的标识id -->
	<resultMap type="com.mybatis.po.User" id="userResultMap">
	<!-- id标签设置查询结果集中的标识(主键),column为标识在数据库中的列名,property为标识在Java类中的属性名 -->
	<id property="id" column="user_id"/>
	<!-- 配置User类中的映射关系 -->
	<result property="username" column="user_name"/>
	<result property="gender" column="user_gender"/>
	<result property="province" column="user_province"/>
	<result property="city" column="user_city"/>
	</resultMap>

在resultMap标签对中,type表示返回的结果集记录最终映射的Java实体类,id属性是这个resultMap的唯一标识,我们可以根据需要设置多个resultMap。下一行的id标签中设置返回结果集中的唯一标识为“id”,(在User类中主键是“id”)。下面的result标签就是对返回结果集中其他列的映射配置,property对应的是Java实体类中的属性,而column对应的是数据库中的列名,也就是返回结果集中的列名,每一个result标签都会根据property和column来进行映射,这样我们就可以自定义配置不同的列名应该和哪一个属性对应,以后在我们修改数据库列名或者Java实体类的属性时,只需修改这个resultMap中的映射关系即可,而无需去对数据库或实体类做修改。

 

结果集的关联嵌套

上面花了一大段回顾了两种结果集的输出映射,原因为了引出resultMap,一个可以自定义映射关系的结果集映射配置,利用它可以配置一些十分复杂的映射关系。来看一个例子,假如我们的商场数据库中有一张顾客信息表,其对应的Java实体类如下:

package com.mybatis.po;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String password;
	private String gender;
	private String email;
	private String province;
	private String city;
	private Date birthday;
	private int age;
	
	public User() {
//		System.out.println("进入目标类无参数构造方法....");
	}
	// 构造方法初始化
	public User(String username, String password, String gender, String email, String province,
			String city, Date birthday) {
		super();
//		System.out.println("进入目标类有参数构造方法....");
		this.username = username;
		this.password = password;
		this.gender = gender;
		this.email = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值