Mybatis基于xml的一对一、一对多、多对多嵌套结果查询和嵌套查询

本文详细介绍了MyBatis中的一对一、一对多和多对多的嵌套查询与结果映射。通过嵌套查询和嵌套结果两种方式,实现复杂对象的关联加载。分别通过示例说明了在不同场景下如何配置映射文件,以满足从数据库获取并封装复杂数据结构的需求。同时,讨论了嵌套查询可能带来的性能影响。
摘要由CSDN通过智能技术生成

说在前面

MyBatis在映射文件中加载关联关系对象主要通过两种方式:
嵌套查询和嵌套结果。
嵌套查询:
是指通过执行另外一条SQL映射语句来返回预期的复杂类型。
会执行多条sql语句
嵌套结果查询:
是使用嵌套结果映射来处理重复的联合结果的子集。
只会执行一条复杂的sql语句

简单来说:
嵌套查询是多条sql语句分开写并配置
嵌套结果是一条sql语句关联查询并配置
实质效果是一样的。
但嵌套查询会导致数据库访问次数不定,进而有可能影响到性能。

一对一查询

举例:人和身份证是一一对应的,满足一对一查询
pojo:

public class Person{
   
	private String name;
	private Integer id;
	private String gender;
	private Integer age;
	private Card card;
	//省略getter、setter
}

public class Card{
   
	private Integer cid;
	private String address; //住址
	//省略getter、setter
}

* 数据库表字段与实体类属性对应,person表通过外键cid关联card表

需求:查询person时要求把card也查询出来
问题:数据库查询只能查询出card的字段,不能封装进person实体里的card属性
方法:编写resultMap,手动指定person表字段和实体属性的映射关系
1.嵌套结果查询

	<resultMap id="personMap" type="Person"> <!-- type:实体类名,如不定义别名需写全类名 -->
		<!--column是数据库表的字段名,property是实体的属性名-->
		<id column="id" property="id"></id> 
		<result column="name" property="name"></result>
		<result column="gender" property="gender"></result>
		<result column="age" property="age"></result>
		<!--封装card-->
		<association property="card" javaType="Card"> <!--property:当前实体中的pojo属性  javaType:当前实体中的pojo属性的类型,此处已定义别名-->
			<!--映射card属性-->
			<id column="cid" property="cid"></id>
			<result column="address" property="address"></result>
		</association>
	</resultMap>
	<!--查询-->
	<select id="findAll" resultMap="personMap">
		select * from person p,card c where p.id = c.cid
	</select>

2.还是嵌套结果查询,抽取出被映射的pojo,提高复用性

<resultMap type="Card" id="cardMap">
	<id column="cid" property="cid"></id>
	<result column="address" property="address"></result>
</resultMap>

<resultMap type="Person" id
  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值