006 mybatis关联查询(一对一、一对多)


商品订单数据模型
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发,关联查询用户信息为一对一查询。如果从用户信息出发,查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

一对一查询

需求
查询所有订单信息,关联查询下单用户信息。

SQL语句

SELECT
orders.*,
user.username,
user.address
FROM
orders LEFT JOIN user
ON orders.user_id = user.id

主信息:订单信息
从信息:用户信息

方法一:resultType

方法二:resultMap

使用resultMap进行结果映射,定义专门的resultMap用于映射一对一查询结果。

创建扩展po类

创建OrdersExt类(该类用于结果集封装),加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

public class OrdersExt extends Orders {
	private User user;// 用户对象
	// get/set。。。。
}
Mapper映射文件
<!-- 查询订单关联用户信息使用resultmap -->
<resultMap type="OrdersExt" id="ordersAndUserRstMap">
	<id column="id" property="id"/>
	<result column="user_id" property="userId"/>
	<result column="number" property="number"/>
	<result column="createtime" property="createtime"/>
	<result column="note" property="note"/>
	<!-- 一对一关联映射 -->
	<!--
	property:Orders对象的user属性
	javaType:user属性对应 的类型
	-->
	<association property="user" javaType="com.xd.mybatis.po.User">
		<!-- column:user表的主键对应的列 property:user对象中id属性-->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="address" property="address"/>
	</association>
</resultMap>
<select id="findOrdersAndUserRstMap" resultMap="ordersAndUserRstMap">
	SELECT
		o.id,
		o.user_id,
		o.number,
		o.createtime,
		o.note,
		u.username,
		u.address
	FROM
		orders o
	JOIN `user` u ON u.id = o.user_id
</select>


association:表示进行一对一关联查询映射
property:表示关联查询的结果存储在com.kkb.mybatis.po.Orders的user属性中
javaType:表示关联查询的映射结果类型

Mapper接口

在UserMapper接口中,添加以下接口方法:

public List<OrdersExt> findOrdersAndUserRstMap() throws Exception;
测试代码
public void testfindOrdersAndUserRstMap()throws Exception{
	//获取session
	SqlSession session = sqlSessionFactory.openSession();
	//获限mapper接口实例
	UserMapper userMapper = session.getMapper(UserMapper.class);
	//查询订单信息
	List<OrdersExt> list = userMapper.findOrdersAndUserRstMap();
	System.out.println(list);
	//关闭session
	session.close();
}
小结

使用resultMap进行结果映射时,具体是使用association完成关联查询的映射,将关联查询信息映射到pojo对象中。

一对多查询

需求
查询所有用户信息及用户关联的订单信息。

SQL语句

SELECT
	u.*,
	o.id oid,
	o.number,
	o.createtime,
	o.note
FROM
	`user` u
LEFT JOIN orders o ON u.id = o.user_id

主信息:用户信息
从信息:订单信息
分析
在一对多关联查询时,只能使用resultMap进行结果映射。
1、一对多关联查询时,sql查询结果有多条,而映射对象是一个。
2、resultType完成结果映射的方式的一条记录映射一个对象。
3、resultMap完成结果映射的方式是以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到主对象中。

修改po类

在User类中加入List orders属性

private List<Orders> orders;

Mapper映射文件

在UserMapper.xml文件中,添加以下代码:

<resultMap type="user" id="userAndOrderRstMap">
	<!-- 用户信息映射 -->
	<id property="id" column="id"/>
	<result property="username" column="username"/>
	<result property="birthday" column="birthday"/>
	<result property="sex" column="sex"/>
	<result property="address" column="address"/>
	<!-- 一对多关联映射 -->
	<collection property="orders" ofType="orders">
		<id property="id" column="oid"/>
		<result property="userId" column="id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
		<result property="note" column="note"/>
	</collection>
</resultMap>
<select id="findUserAndOrderRstMap" resultMap="userAndOrderRstMap">
	SELECT
	u.*,
	o.id oid,
	o.number,
	o.createtime,
	o.note
	FROM
	`user` u
	LEFT JOIN orders o ON u.id = o.user_id
</select>

Collection标签:定义了一对多关联的结果映射。
property=“orders”**:关联查询的结果集存储在User对象的上哪个属性。
ofType=“orders”**:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也
可以使用全限定名。

Mapper接口

public List<User> findUserAndOrdersRstMap() throws Exception;

测试代码

@Test
public void testFindUserAndOrdersRstMap() {
	SqlSession session = sqlSessionFactory.openSession();
	UserMapper userMapper = session.getMapper(UserMapper.class);
	List<User> result = userMapper.findUserAndOrdersRstMap();
	for (User user : result) {
		System.out.println(user);
	}
	session.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡所有相 皆是虚妄。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值