acrisliu
V2EX  ›  Java

MyBatis 与 Spring Data JPA 选择谁?

  •  
  •   acrisliu · Jun 12, 2016 via Android · 34617 views
    This topic created in 3802 days ago, the information mentioned may be changed or developed.
    公司项目准备重构,目前在持久层框架选择上有 MyBatis 和 Spring Data JPA 两个选择, MyBatis 应用比较广泛,但是写映射文件比较繁琐。 Spring Data JPA 用起来比较简单,而且与 Spring Boot 整合起来很好用,但是 Google 了一下相关资料比较少,不知道与 MyBatis 相比优缺点如何。

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

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

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

    仔细拜读之
    hantsy
    hantsy
    Jun 12, 2016
    12
    Data JPA 用了好几年了。
    letitbesqzr
    letitbesqzr
    Jun 12, 2016❤️1
    13
    @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
    hantsy
    Jun 12, 2016❤️2
    14
    Data JPA 对 JPA 2 中的 Criteria API 和 QueryDSL 作为简单的封装,不用再写 SQL 、 HQL , JPQL 了。

    在过去的一些项目中, Type Safe 几乎是硬性要求,基于 String 的查询语句是绝对不允许的。另外一种选择是 JOOQ 。
    hantsy
    hantsy
    Jun 12, 2016❤️1
    15
    @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
    zacard
    Jun 12, 2016❤️1
    16
    既然是重构了,想必规模不小了。还是使用 mybatis 吧。
    写映射文件麻烦?: https://github.com/mybatis/generator
    spring-boot 整合麻烦?: https://github.com/mybatis/spring-boot-starter
    beneo
    beneo
    Jun 12, 2016
    17
    hibernate
    hantsy
    hantsy
    Jun 12, 2016❤️1
    18
    qa52666
    qa52666
    Jun 12, 2016❤️1
    19
    推荐: 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
    hcymk2
    Jun 12, 2016
    20
    如果是面向 SQL 编程(通过复杂的 SQL 查询解决问题),我觉得还是用 MyBatis.
    fengkuok
    fengkuok
    Jun 12, 2016
    21
    主要看团队人员技术能力,如果是自己用的话无所谓哪个了。
    acrisliu
    acrisliu
    OP
    Jun 12, 2016
    22
    感谢各位
    yifeng
    yifeng
    Jun 12, 2016 via iPhone
    23
    mybatis generator 插件挺好用的,数据库表一步映射 dao 、 example 、 mapper ,复杂点儿的数据库操作手动添加一下,不管用哪个,熟练了就好了
    beginor
    beginor
    Jun 12, 2016 via Android
    24
    貌似是在 MyBatis 和 Hibernate 之间选择了,推荐 Hibernate ,简单查询用 HQL 搞定,特殊的用 SQL
    zhenjiachen
    zhenjiachen
    Jun 12, 2016
    25
    spring data jpa +1
    wupher
    wupher
    Jun 12, 2016
    26
    本质上区别不大,使用 JPA/Hibernate 要看团队成员熟练度和习惯。 HQL 写不清或者映射坑爹会比较让项目经理、架构师头痛。

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

    如果抛开编程的基础素质不谈,基本上就是个熟练与喜好的问题。你用 jpa / Hibernate 也可以搞成 iBatis 那样,所有的 SQL 会放在 properties 里。(会看着怪难受的)
    zonghua
    zonghua
    Jun 12, 2016
    27
    @qa52666 哪个插件啊?我只知道 Mybait 的话每个映射的属性都要手写,要写好多好多
    thinkmore
    thinkmore
    Jun 13, 2016
    28
    推荐 Mybatis,配置文件可以自动生成呀
    ik1010
    ik1010
    Sep 6, 2016
    29
    spring boot 的自动配置有时候迷之错乱
    acrisliu
    acrisliu
    OP
    Sep 6, 2016 via Android
    30
    acrisliu
    acrisliu
    OP
    Sep 6, 2016 via Android
    31
    @ik1010 刚手抖了。。 哪里会错乱?
    ik1010
    ik1010
    Sep 6, 2016
    32
    @acrisliu 就是有的时候自动配置会出错,重启一下就好了,迷。
    acrisliu
    acrisliu
    OP
    Sep 6, 2016 via Android
    33
    @ik1010 好奇怪,我没遇到过😅
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1088 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 18:16 · PVG 02:16 · LAX 10:16 · JFK 13:16
    ♥ Do have faith in what you're doing.