V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cs4814751
V2EX  ›  Java

请教 Mybatis 多对多 的最佳实践

  •  
  •   cs4814751 · 2017-02-09 17:44:03 +08:00 · 2453 次点击
    这是一个创建于 2862 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    然后有一个 Club ,俱乐部表

    然后是他们俩的索引表

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

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

    连表是迫不得已的时候才做.
    cs4814751
        6
    cs4814751  
    OP
       2017-02-09 20:23:47 +08:00
    @zhx1991 比如我用会员 ID 去查索引表,能查到对应的所有俱乐部 ID ,然后再挨个查俱乐部表?这样不是要多进行好多次查询吗?性能没有损失吗
    coolzxbin
        7
    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
        8
    domty  
       2017-02-10 16:01:06 +08:00
    自设结果集,查询用连接即可。

    需要你自己在 xml 定义一个新的 resultMap 和一个查询。
    zhx1991
        9
    zhx1991  
       2017-02-11 12:11:23 +08:00
    @cs4814751 不用挨个查啊, 用 in (ids) 一次就查出来了, 你的需求只用查三就搞定.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3796 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 05:27 · PVG 13:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.