说在前面
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