mybatis(七) 一对一查询 一对多查询 多对多查询

关联查询

 mybatis实现表与表之间的查询,将查询结果集进行映射,重点讲resultMap完成高级映射,大家了解resultMap的使用方法。


数据模型

订单商品模型:



目标:分析表与表之间的关系。 

分析步骤: 

1、按模块去分析表,不要将系统全部表一次性分析

2、了解每个表存储了什么业务数据

3、了解表中关键字段(主键、外键、索引字段、非空字段)

4、了解表与表之间数据库级别的关系(外键关系)

5、表与表之间的业务关系(一对一、一对多、多对多)

注意:分析表与表之间的业务关系时一定要建立 在某种业务意义基础上

user表:存储了购买用户信息

网民,在电商系统中注册成为购买用户

orders表:存储了用户创建的订单信息

用户购买东西,一次不管购买多少商品只会创建一个订单

比如:张三一次购买手机、电脑,在orders表插入一条订单记录

 

orderdetail表:存储用户创建订单的详细信息,记录当时用户购买商品的购买信息

比如:张三一次购买手机、电脑,在orders表插入一条订单记录,在订单明细表插入两条记录,订单明细表每条记录对应一个商品信息

items商品表:存储了电商系统中的商品信息,用户在网站查看的商品信息就是来源与这张表

比如:网站销售手机,在这个表中插入很多的不同型号手机商品信息

  

orders--->user

一个订单只能由一个用户创建,一对一关系

user--->orders

一个用户可以创建多个订单,一对多关系


一对一查询

 需求

查询订单关联查询用户信息

 

 分析

使用mybatis开发持久层的dao接口时,要分析的重点就是sql语句如何实现? 

主查询表:orders订单表

关联查询表:user用户信息

确定关联查询方法:包括内链接、外链接

由于orders表有外键user_id,根据user_id去查询user只能查询到一条记录的。就可以使用内链接。

SELECT 
  orders.*,
  user.username,
  user.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

 基本数据模型po

一个表对应一个po类,表名和po类名一致,表的属性和po的属性一致。



 resultType实现 

resultType映射规则:sql查询出几条记录,只要保证sql列名和resulttype指定的pojo类型的属性一致,可以映射成功,sql查询出几条记录最终映射生成的List<pojo>就有几个对象。

 
 自定义pojo

由于与表对应的po类的属性不能够全部包括下边列名,所以自定义pojo,属性名和下边的列名保持一致


mapper.xml

mapper.java

 resultMap实现

 需求 

主查询是订单信息,要将主查询订单信息映射到orders对象中,在orders中创建user属性,让关联查询出来的用户信息映射到orders对象中的user属性中。其主要目标为了获取信息方便,如果想获取用户的信息,调用orders对象的getUser()方法即可。

orders中创建user属性

mapper.xml

resultMap

mapper.java


 小结 

如果没有特殊的要求,使用resultType是比较方便,只要能够保证sql查询的列和pojo属性名一致可以映射成功,如果pojo中属性少了,添加属性即可。 

特殊的要求:

如果需要将关联查询的信息映射到pojopojo属性中, 为了获取数据方便,可以使用resultMap

如果使用延迟加载,只能使用resultMap



 一对多查询 

 需求 

查询订单关联查询明细信息

分析

主查询表:orders订单表

关联查询表:orderdetail订单明细表

使用内链接

SELECT 
  orders.*,
  user.username,
  user.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num
FROM
  orders,
  USER ,
  orderdetail
WHERE orders.user_id = user.id  AND orderdetail.orders_id = orders.id

 映射需求

将主查询的订单信息映射到orders对象中,将订单关联的明细信息映射到orders对象中List<Orderdetail>

根据此需求分析使用resultType不能实现,只能使用resultMap

修改orders类添加List属性


mapper.xml

resultMap

mapper.java


associationcollection

 association:用于将关联查询信息映射到单个对象中。

标签注意使用javaType指定关联映射的对象类型

 

collection:用于将关联查询信息映射到集合对象中。

 标签注意使用ofType指定关联映射的Listpojo的类型。


 多对多查询 

 需求 

查询用户信息及用户购买的商品信息

 分析

主查询表:user用户信息 

关联查询表:orders订单、orderdetail订单明细、items商品信息 

采用内链接关联。

SELECT 
  orders.*,
  user.username,
  user.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  items.name items_name,
  items.pic items_pic
FROM
  orders,
  USER,
  orderdetail,
  items
WHERE orders.user_id = user.id 
  AND orderdetail.orders_id = orders.id 
  AND items.id = orderdetail.items_id

 映射需求 

user中设置一个List<Orders> orders属性,在order对象中设置List<Orderdetail> orderdeils 属性,在Orderdetail中设置Items属性。

最终查询出来的用户列表,用户信息映射到List<User>中,用户创建的订单信息隐射到user中的List<Orders> orders属性,订单下的明细映射到order对象中List<Orderdetail> orderdeils 属性,订单明细所对应的商品信息映射到OrderdetailItems属性

修改po




mapper.xml

resultMap
<!-- 查询用户及用户购买的商品信息 
	最终要将查询结果映射成List<User>
	-->
	<resultMap type="user" id="userAndItemsResultMap">
		<!-- 用户信息 -->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="address" property="address"/>
				
		<!-- 订单信息
		一个用户可以创建多个订单
		 -->
		 <collection property="ordersList" ofType="cn.itcast.mybatis.po.Orders">
		 	<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" />
			 	<!-- 订单明细信息
			一个订单包括多个明细信息
			 -->
			 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
			 		<id column="orderdetail_id" property="id"/>
					<result column="id" property="ordersId"/>
					<result column="items_id" property="itemsId"/>
					<result column="items_num" property="itemsNum"/>
							<!-- 商品信息 
							一个明细对应一个商品
							-->
							<association property="items" javaType="cn.itcast.mybatis.po.Items">
								<id column="items_id" property="id"/>
								<result column="items_name" property="name"/>
								<result column="items_pic" property="pic"/>
							</association>	
			 </collection>
		 </collection>			
	</resultMap>

mapper.java

 resultMap总结

resultMap实现高级映射,如果对结果有高级映射的需求可以使用reusltMap,需求比如:将一个列表数据映射到pojolist属性中采用resultmap

如果仅仅是将查询列表简单映射为List<pojo>方式,列表中每个pojo对应一条记录,采用resultType即可。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值