使用 mybatis 到底要不要写一对多、一对一关联 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
loshine1992
V2EX    Java

使用 mybatis 到底要不要写一对多、一对一关联

  •  
  •   loshine1992
    Loshine 2015-10-26 16:03:08 +08:00 16885 次点击
    这是一个创建于 3704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方法一

    • Dao 层有一对多、一对一关联
    • Service 层写业务逻辑

    方法二

    • Dao 层不写一对多、一对一关联,只提供基本的增删查改
    • Service 层完成关联查询等以及写业务逻辑

    方法一在效率上貌似有优势,但写 resultMap 和语句真是不开心
    方法二对程序员比较友好,但效率不如方法一,而且 service 层会比较臃肿

    不知道大家的项目中都是如何使用的

    PS:临时从 Android 调到 Web 这边帮忙, web 技术并不精通,还请大家多多指教

    17 条回复    2015-10-28 09:03:48 +08:00
    zts1993
        1
    zts1993  
       2015-10-26 20:28:50 +08:00
    不知道。。。我感觉看心情。简单的可以关联一下。。数据量大,感觉就不能这么玩了。。
    zkaip
        2
    zkaip  
       2015-10-26 22:01:28 +08:00
    我是主要在 service 层写逻辑, dao 层只简单的做一些关联查询
    Lpl
        3
    Lpl  
       2015-10-27 08:54:39 +08:00 via Android   1
    一般在实际开发中我们都使用的是方法一,因为这样子比较适合多人开发吧。而且基本的增删改查可以使用 mybatis 的 xml 文件自动生成的。

    resultmap 有个好处是需要什么数据就拿什么数据,不怎么需要 vo 层了。
    loshine1992
        4
    loshine1992  
    OP
       2015-10-27 09:18:38 +08:00
    @Lpl 感谢,知道咋弄拉
    loshine1992
        5
    loshine1992  
    OP
       2015-10-27 09:36:38 +08:00
    @Lpl 还有一个问题请教一下噢,比如我现在存在以下对应关系

    * 班级 一对多 学生
    * 学生 一对多 科目
    * 科目 一对一 老师

    那么我需要在查询班级的时候直接把 班级对应学生 学生对应科目 科目对应老师 的**resultMap**都写好然后再写好查询`SQL`语句么

    那如果有很复杂的对应关系的时候会不会比较麻烦额。。
    domty
        6
    domty  
       2015-10-27 09:49:40 +08:00   1
    单表的查询都是用 mybatis generator 生成 xml,bean 之类的代码,虽然用起来比较嗦但是还是还是挺好用的.

    多表查询就得自写 xml 的 sql 了以及自设的结果集了,关联查询用 join 感觉还是挺方便的.
    thinkmore
        7
    thinkmore  
       2015-10-27 09:54:46 +08:00
    多对多好麻烦。如果需要这种直接关联查询出来之后,然后在组装到对应的实体类中去不就行了,当然这里组装麻烦了一点点吧。

    数据量小的情况下还是建议多对多的
    loshine1992
        8
    loshine1992  
    OP
       2015-10-27 09:58:14 +08:00
    @domty 感谢回答,目前我采取的也是这种方式
    loshine1992
        9
    loshine1992  
    OP
       2015-10-27 10:04:32 +08:00
    @thinkmore 确实,我也觉得这种情况下写 SQL 还是比较麻烦的。。
    codeyung
        10
    codeyung  
       2015-10-27 10:47:41 +08:00   1
    一般都多表 join 返回对象 数据库没有做关联 - - 都是单表自己写 sql
    PandaFack
        11
    PandaFack  
       2015-10-27 14:41:45 +08:00   1
    一般都多表 join 返回对象 数据库没有做关联 - - 都是单表自己写 sql + 1
    Lpl
        12
    Lpl  
       2015-10-27 19:51:13 +08:00 via Android   1
    @loshine1992 按照我们是这样子做的,把三张表写 sql 语句,使用 left join 取出来一些你需要的列放在 resultmap 中
    Lpl
        13
    Lpl  
       2015-10-27 19:52:03 +08:00 via Android
    left join 类似的有坑...我记得当时踩过,然后忘了,就是在一对多的时候出现的
    loshine1992
        14
    loshine1992  
    OP
       2015-10-27 20:00:41 +08:00
    @Lpl 感谢回复,其实已经使用这种方式了,就是不太喜欢这种机械式的劳作。。。。
    Lpl
        15
    Lpl  
       2015-10-27 20:05:36 +08:00 via Android
    @loshine1992 但是这种是比较好的方式。有一点,你们是不是在数据库中显式定义 foreign key 了?这样子不好
    loshine1992
        16
    loshine1992  
    OP
       2015-10-27 21:17:29 +08:00
    @Lpl 没有显式定义外键的,这个在项目启动的时候我就和后端的负责人建议过。
    目前其实有一个比较糟糕的情况,因为后端的负责人之前不太了解 Spring MVC 和 Mybatis
    所以现在的代码是比较不规范的
    比如 Controller 层中大量使用了 request.addAttribute(key,value) 而非 modelMap.put(key, value),返回 json 也是直接操作的 response
    最为麻烦的其实是。。他手写了 dao 层的实现而没有使用 Spring 扫描 Mybatis 的代理实现方式。。。。。。。
    Lpl
        17
    Lpl  
       2015-10-28 09:03:48 +08:00 via Android
    @loshine1992 你们后端负责人为什么不听建议...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     965 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 19:07 PVG 03:07 LAX 11:07 JFK 14:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86