MyBatis 与 Spring Data JPA 选择谁? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
acrisliu
V2EX    Java

MyBatis 与 Spring Data JPA 选择谁?

  •  
  •   acrisliu 2016-06-12 12:29:16 +08:00 via Android 33777 次点击
    这是一个创建于 3417 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司项目准备重构,目前在持久层框架选择上有 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 的灵活之处
    xiaolanglang
        9
    xiaolanglang  
       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 Lst<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     Solana     1212 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 17:41 PVG 01:41 LAX 10:41 JFK 13:41
    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