MyBatis进阶四:Mybatis对象关联查询;(【一对多】(<collection>)&【多对一】(association))

(1)对本篇博客的内容有一个疑问,在写一个表的实体类后,,,,随着后续的开发,需要随时修改这个实体类???所以,这就涉及到项目的功能一开始就要规划清楚,不要随时新增或者修改需求。。。。。这样才能做好规划,进而不要任意修改已经写好的代码。。。。说多了都是泪,经验太少~~~

(2)数据库表的设计原则,设计能力有待加强。

(3)【一对多】的情况下,【多的那个表】就是【一的那个表】的“附庸”?

目录

零:为什么需要本篇博客的东西

(1)原因1:这个例子是自己的主观观点(以后,随着经验加深,回头看的时候大概率会觉得略幼稚~~~)

(2)原因2:对象关联查询可以简化工作量

一:【多表关联查询】和【多表级联查询(或称对象关联查询)】的区别;【一对一】,【一对多】,【多对多】的表关系列举;

预先说明:两张表的关系 

二:案例1:【一对多】表关系下的案例

首先,因为涉及到t_goods_detail表,所以添加GoodsDetail类,添加goods_detail.xml

然后,在Goods类中,添加【List goodsDetails】→在对象层面上完成了Goods对象和GoodsDetail对象的关联

然后,为了指明【List goodsDetails】的数据来源,需要在goods.xml中进行对象关联的描述

最后,就是实际调用

二:案例2:【多对一】表关系下的案例

首先,在GoodsDetail中添加Goods类型的对象→在对象层面上完成GoodsDetail对象和Goods对象的关联

然后,为了指明GoodsDetail类对象中的goods的数据来源,需要在goods_detail.xml中进行对象关联的描述

最后,就是实际调用

一个小问题


零:为什么需要本篇博客的东西

(1)原因1:这个例子是自己的主观观点(以后,随着经验加深,回头看的时候大概率会觉得略幼稚~~~)

一个例子说明:

如下:t_goods表:(在实际中,会有Goods实体类与之对应)

goods_id title current_price
768 莫斯利安 78
769 安慕希 67

 

t_goods_detail表:(在实际中,会有GoodsDetail实体类与之对应)

gd_id goods_id gd_detail
9001 768 莫斯利安描述1
9002 768 莫斯利安描述2
9003 769 安慕希描述1
9004 769 安慕希描述2

 

比如要查询【莫斯利安的信息和它的描述】如果采用以前的多表关联查询的策略,也就是只需要一条SQL语句就完成查询,其SQL语句大致是:

SELECT *
FROM t_goods g LEFT JOIN t_goods_detail d ON g.goods_id=d.goods_id
WHERE g.goods_id=768;

这背后其实是笛卡尔积在支撑啦,其查询的结果如下:很简单哈,这也是以前经常遇到的,比较熟悉的东西;

 

goods_id title current_price gd_id goods_id(1) gd_detail
768 莫斯利安 78 9001 768 莫斯利安描述1
768 莫斯利安 78 9002 768 莫斯利安描述2

 

可以发现,这个查询结果的的字段包含了两张表的字段,,,,所以,单纯用Goods实体类对象或者GoodsDetail实体类对象是不能承载这个数据的。

为了能承载存储这些数据,自然可以考虑使用以前遇到过的GoodsDAO的策略去处理(GoodsDao的例子见MyBatis入门八:多表关联查询二:ResultMap结果映射;);但是,如果继续使用MyBatis入门八:多表关联查询二:ResultMap结果映射;中的那种传统的DAO策略,就会出现这种情况:【为了能保存上面的查询结果,需要用两个GoodsDAO对象去承载存储】,而这样是不太好的。

为了,对上面DAO策略的一点小小改进,就需要抛弃上面的【多表关联查询】策略,而是采用本篇博客的中的【多表级联查询】(或称对象关联查询)的东西了。

即基本思想就是:即,因为t_goods表和t_goods_detail表是【一对多】的关系,所以,Goods实体类就这样写。其结果就是【为了能保存上面的查询结果,只需要一个Goods对象去存储就好了】。

public class Goods {
    private Integer goodsId;
    private String title;
    private Float currentPrice;
    private List<GoodsDetail> goodsDetails;
}

当然,为了实现上面功能,需要在Mybatis中设置一下,以实现对象关联查询或称【多表级联查询】。

 

(2)原因2:对象关联查询可以简化工作量

通过【一对多】或者【多对一】关联查询,可以降低开发的工作量,让这些繁琐的SQL语句,让mybatis自动帮我们执行;所有的SQL放在xml中,由mybatis进行自动的管理与执行,降低了出错的风险,,提高开发效率。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值