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

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

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

    方法一

    • 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   ·   我们的愿景   ·   实用小工具   ·   1032 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:58 · PVG 03:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.