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

MyBatis 与 Spring Data JPA 选择谁?

  •  
  •   acrisliu · 2016-06-12 12:29:16 +08:00 via Android · 33171 次点击
    这是一个创建于 3090 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司项目准备重构,目前在持久层框架选择上有 MyBatis 和 Spring Data JPA 两个选择, MyBatis 应用比较广泛,但是写映射文件比较繁琐。 Spring Data JPA 用起来比较简单,而且与 Spring Boot 整合起来很好用,但是 Google 了一下相关资料比较少,不知道与 MyBatis 相比优缺点如何。

    个人偏向于 Spring Data JPA ,有没有用过的老司机说说有没有坑?
    33 条回复    2016-09-06 12:54:20 +08:00
    qa52666
        1
    qa52666  
       2016-06-12 12:32:50 +08:00 via Android   ❤️ 1
    推荐 MyBatis
    acrisliu
        2
    acrisliu  
    OP
       2016-06-12 12:35:27 +08:00 via Android
    @qa52666 能说下理由么,谢谢哈
    hujianxin
        3
    hujianxin  
       2016-06-12 12:43:23 +08:00   ❤️ 1
    spring data jpa 看着真的不错,但是就是资料较少,如果有能力的话,我还是推荐 spring data jpa ,这样的话一致性好,都是 spring 的子项目,心里舒服。嘿嘿嘿
    letitbesqzr
        4
    letitbesqzr  
       2016-06-12 12:44:00 +08:00 via iPhone   ❤️ 1
    spring boot jpa
    brucefeng
        5
    brucefeng  
       2016-06-12 12:48:15 +08:00   ❤️ 1
    用你们最熟悉的技术,如果团队对两个都熟悉,就对比下两个的优缺点,看看哪个最能接受;如果团队都不熟悉,那就找学习成本较低,资料更多的那个。
    tedd
        6
    tedd  
       2016-06-12 12:52:14 +08:00 via iPhone   ❤️ 1
    Jooq?
    pelloz
        7
    pelloz  
       2016-06-12 12:58:13 +08:00   ❤️ 1
    看团队对技术的熟悉与接收程度罗,我不熟悉 Spring Data JPA ,但是 MyBatis 的映射文件不都应该是使用工具自动生成的吗?我现在的公司根据项目需要自己实现了一个 CodeGenerator ,一般的代码模板都是能够自动生成的,需要手写的部分比较少。而且我觉得 MyBatis 特别灵活,我蛮喜欢的。
    odirus
        8
    odirus  
       2016-06-12 13:02:59 +08:00
    @pelloz 我用 MyBatis 没多久,还不知道怎么做更加合适,不知道自动生成该如何做合适,都是手写的。

    如果阔以的话,是否可以简单分享一下 MyBatis 的灵活之处
    gy911201
        9
    gy911201  
       2016-06-12 13:13:38 +08:00
    spring data jpa 底层就是封装的 hibernate ,整体算是比较简单的项目,其实最后就是 Hibernate vs MyBatis 的选择了
    pelloz
        10
    pelloz  
       2016-06-12 13:14:40 +08:00   ❤️ 1
    @odirus 网上应该有现成的 MyBatis Generator ,我没用过,大概是这个? https://github.com/mybatis/generator

    灵活嘛,我觉得可以直接控制到动态的 sql 语句而且类型转换都已经帮我们封装好了,已经很好用了。而且,如果你上网找找,还能发现有人写了热加载的插件,我自己也照网上的实现自己封装了一下日常使用,可以做到调试程序的时候直接修改 mapper 文件不需要重启项目。
    odirus
        11
    odirus  
       2016-06-12 13:16:17 +08:00
    @pelloz 还有这么多 NB 特性哇,谢谢。

    仔细拜读之
    hantsy
        12
    hantsy  
       2016-06-12 13:29:25 +08:00
    Data JPA 用了好几年了。
    letitbesqzr
        13
    letitbesqzr  
       2016-06-12 13:30:19 +08:00   ❤️ 1
    @gy911201 是封装的 jpa ... hibernate 只是有提供 hibernate-entitymanager 来实现 jpa 而已...

    spring data jpa 其实只用用他们提供的 Specification 转 jpa 2.0 的 Predicate 以及提供的分页排序方法就行了 . 关于他提供的什么 query 注解 还有 什么通过接口函数命令的方式来查询 感觉太鸡肋了.
    . 特别是关系复杂的系统里.. 关联的表特别多.. jpa 这种就很方便了..

    就比如以下这个查询..用 mybatis 写 需要写多少 sql ? 如果还要加上 分页 排序 ?

    (gist 似乎抽了,打不开,直接贴代码)

    ```
    @Override
    public List<Program> getProgramsByGroup(Collection<Group> groups, Dept dept, Collection<Level> levels) {
    Set<String> strGroups = groups.stream().map(Group::getId).collect(Collectors.toSet());
    return super.findAll((root, query, cb) -> {
    List<Predicate> levelPredicate = Lists.newArrayList();
    levels.forEach(level -> {
    levelPredicate.add(cb.equal(root.get(Program_.level), level));
    });
    return cb.and(
    root.join(Program_.groups).get(Group_.id).in(strGroups),
    cb.equal(root.join(Program_.dept).get(Dept_.id), dept.getId()),
    cb.or(levelPredicate.stream().toArray(Predicate[]::new))
    );
    });
    }
    ```
    hantsy
        14
    hantsy  
       2016-06-12 13:35:25 +08:00   ❤️ 2
    Data JPA 对 JPA 2 中的 Criteria API 和 QueryDSL 作为简单的封装,不用再写 SQL 、 HQL , JPQL 了。

    在过去的一些项目中, Type Safe 几乎是硬性要求,基于 String 的查询语句是绝对不允许的。另外一种选择是 JOOQ 。
    hantsy
        15
    hantsy  
       2016-06-12 13:43:41 +08:00   ❤️ 1
    @acrisliu Data JPA 的一些用法可以看看这个,好几年前写的(主要对 Spring3 ):

    https://github.com/hantsy/spring-sandbox/wiki/spring-data-jpa

    有点老了,代码可以参考 Spring 4 版本(原来的 Spring 3 代码已经全部更新,删除了 XML 配置):

    https://github.com/hantsy/spring-sandbox/
    zacard
        16
    zacard  
       2016-06-12 13:45:16 +08:00   ❤️ 1
    既然是重构了,想必规模不小了。还是使用 mybatis 吧。
    写映射文件麻烦?: https://github.com/mybatis/generator
    spring-boot 整合麻烦?: https://github.com/mybatis/spring-boot-starter
    beneo
        17
    beneo  
       2016-06-12 13:45:43 +08:00
    hibernate
    hantsy
        18
    hantsy  
       2016-06-12 13:46:09 +08:00   ❤️ 1
    qa52666
        19
    qa52666  
       2016-06-12 13:47:09 +08:00   ❤️ 1
    推荐: MyBatis ,原因有两个。

    1 、 MyBatis 的映射关系等,分页,插入成功后返回主键 ID 等,都是可以通过 MyBatis Generator 插件生成的。
    ![图 2.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf93952afd.jpg)
    ![图 3.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf9395d5a5.jpg)

    2 、 MyBatis 可以自由书写 SQL 语句,发挥 sql 技巧。
    比如下图:
    ![图 1.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf814d236d.jpg)
    hcymk2
        20
    hcymk2  
       2016-06-12 13:51:42 +08:00
    如果是面向 SQL 编程(通过复杂的 SQL 查询解决问题),我觉得还是用 MyBatis.
    fengkuok
        21
    fengkuok  
       2016-06-12 13:52:56 +08:00
    主要看团队人员技术能力,如果是自己用的话无所谓哪个了。
    acrisliu
        22
    acrisliu  
    OP
       2016-06-12 13:53:51 +08:00
    感谢各位
    yifeng
        23
    yifeng  
       2016-06-12 18:52:16 +08:00 via iPhone
    mybatis generator 插件挺好用的,数据库表一步映射 dao 、 example 、 mapper ,复杂点儿的数据库操作手动添加一下,不管用哪个,熟练了就好了
    beginor
        24
    beginor  
       2016-06-12 19:12:57 +08:00 via Android
    貌似是在 MyBatis 和 Hibernate 之间选择了,推荐 Hibernate ,简单查询用 HQL 搞定,特殊的用 SQL
    zhenjiachen
        25
    zhenjiachen  
       2016-06-12 19:43:21 +08:00
    spring data jpa +1
    wupher
        26
    wupher  
       2016-06-12 19:47:06 +08:00
    本质上区别不大,使用 JPA/Hibernate 要看团队成员熟练度和习惯。 HQL 写不清或者映射坑爹会比较让项目经理、架构师头痛。

    MyBatis 映射相对原始(话说现在也支持标签了哈,但是感觉这就有违 MyBatis 将所有 SQL 集于一文件的设计初衷),但是处理原生 SQL 可能会方便 DB Admin 后期检查及 SQL 优化。

    如果抛开编程的基础素质不谈,基本上就是个熟练与喜好的问题。你用 jpa / Hibernate 也可以搞成 iBatis 那样,所有的 SQL 会放在 properties 里。(会看着怪难受的)
    zonghua
        27
    zonghua  
       2016-06-12 19:48:52 +08:00
    @qa52666 哪个插件啊?我只知道 Mybait 的话每个映射的属性都要手写,要写好多好多
    thinkmore
        28
    thinkmore  
       2016-06-13 10:39:55 +08:00
    推荐 Mybatis,配置文件可以自动生成呀
    ik1010
        29
    ik1010  
       2016-09-06 12:39:34 +08:00
    spring boot 的自动配置有时候迷之错乱
    acrisliu
        30
    acrisliu  
    OP
       2016-09-06 12:47:23 +08:00 via Android
    acrisliu
        31
    acrisliu  
    OP
       2016-09-06 12:47:47 +08:00 via Android
    @ik1010 刚手抖了。。 哪里会错乱?
    ik1010
        32
    ik1010  
       2016-09-06 12:50:15 +08:00
    @acrisliu 就是有的时候自动配置会出错,重启一下就好了,迷。
    acrisliu
        33
    acrisliu  
    OP
       2016-09-06 12:54:20 +08:00 via Android
    @ik1010 好奇怪,我没遇到过😅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1345 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:38 · PVG 07:38 · LAX 15:38 · JFK 18:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.