请教 Mybatis 多对多 的最佳实践

2017-02-09 17:44:03 +08:00
 cs4814751

比如如下 有一个 Member ,会员表

然后有一个 Club ,俱乐部表

然后是他们俩的索引表

比如我要在查询的时候,想以会员 id ,查出一个会员的信息,以及他注册了哪些俱乐部,每个俱乐部的注册日期是什么。 这样的话, POJO 该怎么设计呢,索引表是设计成一个包含会员、俱乐部两个引用的类,然后查询出的是索引表对象的列表,还是有什么其他最佳实践呢?

2426 次点击
所在节点    Java
9 条回复
zhx1991
2017-02-09 19:20:41 +08:00
简单讲就是三个类, 分别对应三张表
cs4814751
2017-02-09 19:34:24 +08:00
@zhx1991 比如说,我要查询这个会员注册了哪些俱乐部,注册时间是什么。那我在三个表连接查询的时候,生成的对象,应该是索引表映射成的对象的列表是嘛?
pelloz
2017-02-09 19:43:27 +08:00
你知道 Result_Maps 吗。这个应该可以解决你的问题。
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps
cs4814751
2017-02-09 19:49:04 +08:00
@pelloz 我知道呀 我疑惑的就是多对多有个中间表,如果中间表除了联合主键还有属性的话,那么 POJO 应该怎么设计合适。如果没有中间表的属性,我直接可以会员对象里,包含一个俱乐部的 List ,用 resultmap 映射正好。
zhx1991
2017-02-09 19:51:45 +08:00
@cs4814751 不用连表查, 三个表分别查一次.

连表是迫不得已的时候才做.
cs4814751
2017-02-09 20:23:47 +08:00
@zhx1991 比如我用会员 ID 去查索引表,能查到对应的所有俱乐部 ID ,然后再挨个查俱乐部表?这样不是要多进行好多次查询吗?性能没有损失吗
coolzxbin
2017-02-10 10:49:37 +08:00
<select id="byID" resultType="ClubMember">
select a.id as rid,a.register_date,b.name as cname,c.name as mname from Club_Member a,Club b,Member c where a.member_id = c.id and a.club_id = b.id and a.member_id = #{id}
</select>

class ClubMember {
private int rid;
private Date register_date;
private String cname;
private String mname;
.....
}

如上一次即可查出
domty
2017-02-10 16:01:06 +08:00
自设结果集,查询用连接即可。

需要你自己在 xml 定义一个新的 resultMap 和一个查询。
zhx1991
2017-02-11 12:11:23 +08:00
@cs4814751 不用挨个查啊, 用 in (ids) 一次就查出来了, 你的需求只用查三就搞定.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/339353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX