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

感觉 spring jpa 使用越来越广泛了

  •  3
     
  •   myqa · 2020-12-14 20:34:58 +08:00 · 9498 次点击
    这是一个创建于 1200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    未来可能会取代 mybatis 成为 java orm 第一选择 当然不适用 springboot 的话就不好说了

    65 条回复    2021-08-26 08:57:48 +08:00
    taogen
        1
    taogen  
       2020-12-14 20:44:50 +08:00 via Android   ❤️ 3
    我选 mybatis plus
    fxjson
        2
    fxjson  
       2020-12-14 20:50:06 +08:00
    一直看好 jpa, 但是,但是,国内好像用 mybatis 的多
    xuanbg
        3
    xuanbg  
       2020-12-14 20:54:49 +08:00
    复杂模型比较多,还是用 @Select/@Insert/@Update/@Delete 手写 SQL 舒服,
    manami
        4
    manami  
       2020-12-14 21:50:08 +08:00
    用过都说好
    sue0917
        5
    sue0917  
       2020-12-14 22:18:42 +08:00 via Android   ❤️ 3
    国内 mybatis,vue 国外 jpa reactjs
    chendy
        6
    chendy  
       2020-12-14 22:21:49 +08:00
    遇到不靠谱的产品乱改,模型稳定不下来,jpa 就远没有 mybatis 好用了
    另外,mybatis 不是 orm 。。。
    liyhu
        7
    liyhu  
       2020-12-14 22:26:02 +08:00
    mybatis 永不为奴
    beginor
        8
    beginor  
       2020-12-14 22:29:33 +08:00 via Android
    jpa 可以做到完全的强类型, 这一点 mybatis 做不到
    cheng6563
        9
    cheng6563  
       2020-12-15 01:02:25 +08:00 via Android
    @beginor mybatis 本来就不强类型,他的定位是 SQL 的模板引擎
    echo1937
        10
    echo1937  
       2020-12-15 08:26:13 +08:00
    @taogen #1 如果你用 MP,又甚少用原生 MyBatis 手写 SQL 的话,其实就是另外一个 JPA 。
    optional
        11
    optional  
       2020-12-15 08:41:34 +08:00 via Android   ❤️ 1
    java 的语言特性,支持不了多好的强类型 orm,最后还是得靠 sql 修修补补。
    吐个槽 jpa 连个 upsert 都不敢支持
    totoro52
        12
    totoro52  
       2020-12-15 08:45:30 +08:00
    @chendy + 1 我们的产品就是 当初如果采用 jpa 估计现在的代码跟屎一样了
    Sharuru
        13
    Sharuru  
       2020-12-15 08:46:45 +08:00 via Android   ❤️ 4
    归根结底还是要看项目设计。
    有点像前几天社区里讨论的国内流行 CentsOS,国外流行 Ubuntu 那样的感觉。

    系统符合 DDD 的,JPA 一把梭就出来了,甚至只靠方法声明就能查数据,但这种对 Modeling 的要求很高。

    MyBatis 国内吃香主要还是因为业务复杂程度所致,各种神秘连表。

    一般来说,正常项目都会同时引入 JPA 和 MyBatis,简单查询以及插入用 JPA,复杂,要调优的用 MyBatis 。

    此外,其实 JPA 也是可以发行 Native SQL 进行查询的,只不过写起来没 MyBatis 那么直观就是了(映射,条件判断之类)。
    nutting
        14
    nutting  
       2020-12-15 08:59:54 +08:00
    对,关键是这个 DDD,国内或者说业界不流行这个,都是围绕数据库设计
    totoro52
        15
    totoro52  
       2020-12-15 09:07:10 +08:00
    @Sharuru 其实 mybatisplus 更香一点
    EminemW
        16
    EminemW  
       2020-12-15 09:08:33 +08:00 via iPhone
    查询实体某些字段的时候,要用 Map 接收,或者弄一个接口只写 get 方法,这种方式觉得很怪
    sagaxu
        17
    sagaxu  
       2020-12-15 09:29:14 +08:00 via Android
    jdbctemplate 永不为奴
    graffitist
        18
    graffitist  
       2020-12-15 09:36:59 +08:00
    我们用的是 jpa 做增删改,通过解析 xml 用 jpa 的 Native SQL 来连表查
    myqa
        19
    myqa  
    OP
       2020-12-15 09:37:50 +08:00
    @sagaxu 我们一直用 jdbctemplate,感觉手写 sql 很多问题都不存在了,但是做业务系统有点累还是得 orm
    myqa
        20
    myqa  
    OP
       2020-12-15 09:40:32 +08:00
    @echo1937 但是感觉为什么不直接用 jpa 呢,还可以不爽就更换 orm
    mmdsun
        21
    mmdsun  
       2020-12-15 09:46:16 +08:00
    2020 年,jpa 对 2 表联合查询,只取部分字段的支持怎么样 ?记得以前 jpa 用连表还得配置一对多,多对一,不然 join 直接报错。 感觉 jpa 配置不好,性能很难优化,经常出现 n+1 查询情况。

    现在 jpa 使用还是要配置一对多,多对一么?
    ghostsf
        22
    ghostsf  
       2020-12-15 10:02:10 +08:00
    综合一下 mybatis plus +1
    myqa
        23
    myqa  
    OP
       2020-12-15 10:03:31 +08:00
    @mmdsun 不造呀,现在做项目都是很简单 sql 的查询了,连表都很少用甚至都不用了
    Yano
        24
    Yano  
       2020-12-15 10:03:36 +08:00
    jpa 对单表简单的增删改查还是很爽的~我现在小的项目是 jpa,涉及复杂的再用 jdbcTemplate,其实我感觉 jdbcTemplate 也很简单呀~也很灵活。
    kaiz1121
        25
    kaiz1121  
       2020-12-15 10:05:03 +08:00
    不管 mb 还是 jpa 都是 crud 手动狗头
    lewis89
        26
    lewis89  
       2020-12-15 10:31:54 +08:00
    @mmdsun #21 一直都有 QueryDSL 这种魔改的玩意,你没发现?
    lewis89
        27
    lewis89  
       2020-12-15 10:33:06 +08:00
    @mmdsun #21 只取部分字段? 要用覆盖索引吗?说实话实际上快不了多少,除了背八股文喜欢这么背,真实项目里面基本不用覆盖索引
    echo1937
        28
    echo1937  
       2020-12-15 10:41:49 +08:00
    @myqa #20 我所在项目确实是 JPA + 原生 MyBatis,

    为什么 Spring JPA 运用越来越广泛了?
    1 、微服务兴起,DDD 略有抬头;
    2 、不时兴多表查询了,现在是个程序员都会被教育“超过三张表禁止 join”;
    3 、原生 MyBatis 要么手写效率低,要么靠插件生成一堆模板代码,实在不是我这种 Lombok 党的菜。MyBatis-PLUS 很好地弥补了这个问题,并提供了很多功能增强,但是他定义了很多特有的注解,实现了类似 JPA 的功能,这点我不太喜欢。
    myqa
        29
    myqa  
    OP
       2020-12-15 10:47:51 +08:00
    @echo1937 想当年一开始是 Hibernate 比较流行,后来嫌弃他性能慢(主要是乱用),都用 mybatis,现在 Hibernate 伪装成 spring data jpa 又回来了,真是因吹斯听
    q149072205
        30
    q149072205  
       2020-12-15 11:07:31 +08:00
    jpa 谁用谁知道。用了根本停不下来。。
    mmdsun
        31
    mmdsun  
       2020-12-15 11:17:06 +08:00
    @lewis89 不是什么索引覆盖,单纯问下投影查询的支持。以前都是用 HQL @Query SELECT NEW LanguageDTO 这种语法的,而且用 HQL 还是要配置一对多关系 不然 join 报错,当时感觉就很麻烦。刚刚看文档。这块改进很大。QueryDSL 也用过,但很难写出 mybatis 的动态 SQL 吧,

    <if test="value!=null and value!=''">
    AND a.userId = #{value}
    </if>
    lewis89
        32
    lewis89  
       2020-12-15 11:24:37 +08:00
    @mmdsun #31 这..需要控制这么细致吗 QueryDSL 是可以生成 condition 对象的,无非是要手写代码判断是不是要把这个 condition 加进去...
    Saurichthys
        33
    Saurichthys  
       2020-12-15 11:26:05 +08:00
    用 nutz dao 丝滑
    myqa
        34
    myqa  
    OP
       2020-12-15 11:31:27 +08:00
    @Saurichthys 前提得用 nutz,不过感觉始终是小众框架,类似于 php 上的 tp
    a719031256
        35
    a719031256  
       2020-12-15 11:34:39 +08:00
    看好 mybatis plus,过度方便,jpa 以前用过,现在忘完了。。。。
    Saurichthys
        36
    Saurichthys  
       2020-12-15 11:41:27 +08:00
    @myqa 不用的呀,现在直接 springboot 加一个 nutz-starter 的依赖就行了
    myqa
        37
    myqa  
    OP
       2020-12-15 11:44:08 +08:00
    @Saurichthys 哦哦我五年前用过还没这东西,不过感觉还是 jpa 好毕竟学习资料多
    zhouyou457
        38
    zhouyou457  
       2020-12-15 11:49:12 +08:00
    虽然前期看起来不用写 sql 很美好,但是等业务量(瞎改)一上来的时候需要写各种关联 sql 的时候就恶心了。

    别问我为啥,现在看着手头的产品的源码就头疼。代码版本才到 1.5 就已经难以维护了,service 层各种拼接 SQL 字符串。
    wangyanrui
        39
    wangyanrui  
       2020-12-15 12:00:37 +08:00 via Android
    DDD 的 CQRS 了解一下
    hantsy
        40
    hantsy  
       2020-12-15 12:26:42 +08:00   ❤️ 1
    十年前就取代了。

    用 JPA 的最好去正经的看一本 JPA 的书,比 Pro JPA2,Java Persistence with Hibernate (这个是 Hibernate 作者写的) 等。JPA 是一套完整的 Java Persistence 方案体系,不是简单的取代 SQL 。如果在你在报怨 Hibernate 性能, 在埋怨 Hibernate 执行效果你不如你写的 SQL,如果你不是 SQL 方面专家,对于 95%以上的人都是伪命题,你根本就没正经的用过 Hibernate 。

    再说句费话,只有中国人在用 Mybatis 。
    hantsy
        41
    hantsy  
       2020-12-15 12:30:44 +08:00
    @myqa Spring Data JPA 与 Hibernate 没太大关系。只是默认情况下,Spring Boot 在 DataJPA stater 中添加 Hibernate (作为 JPA 规范的 provider )省事。

    在国内,我帮朋友公司面过工作 5 年以上的 Java 开发人员,不清楚 JPA 与 Hibernate 关系的大把。

    用过 ElipseLinks, OpenJPA 更少,当然一半是听都没听说过。
    wangyanrui
        42
    wangyanrui  
       2020-12-15 12:49:10 +08:00
    国内还是面向数据库编程的比较多

    另说一个很现实的情况:

    中小型公司,其实更会在乎 SQL 到底怎么写,要不要 SELECT 某几个字段,或者怎么 JOIN 等等

    大体量的公司,单说 DB 层面,起码见过的几家国内大厂,都是 SELECT * ,然后自己在代码里实现简单的 JOIN
    复杂 JOIN 不是 CURD boy 负责的事情,有专门的数据部门抽取到 Hive 之类的去单独处理

    加机器远比优化代码要来的迅速,不行就上 TiDB 之类的东西,而且 SELECT 某几个字段和 SELECT * 并没有想象中那么大的性能差距(当然不回表的除外)
    Braisdom
        43
    Braisdom  
       2020-12-15 13:08:01 +08:00
    @hantsy 是的,我接触很多国外的公司基本都是 JPA,很少有 mybatis 的。
    myqa
        44
    myqa  
    OP
       2020-12-15 14:14:50 +08:00
    @hantsy 说没关系也不太确切吧毕竟是底层支持之一
    cmai
        45
    cmai  
       2020-12-15 17:17:12 +08:00
    @lewis89 你是如何得出覆盖索引实际上快不了多少的结论? 覆盖索引不用再次回表,少查一次聚簇索引当然要快很多啊
    cmai
        46
    cmai  
       2020-12-15 17:18:10 +08:00
    @lewis89 当然,是在数据有一定体量的情况下
    jjianwen68
        47
    jjianwen68  
       2020-12-15 17:28:16 +08:00
    那么,你们开始使用 spring r2dbc 了吗
    jeizas
        48
    jeizas  
       2020-12-15 17:41:47 +08:00
    @jjianwen68 mysql 还是没官方支持
    hantsy
        49
    hantsy  
       2020-12-15 17:44:52 +08:00
    @jjianwen68 还不能完全代替 Jdbc 。
    hantsy
        50
    hantsy  
       2020-12-15 17:49:34 +08:00
    @jjianwen68 R2dbc 从开始浮化就自己玩了,最近 Spring Boot 2.4/Spring Data R2dbc 1.2 这个版本,API 变化太大了,API 结构上完全重构了,一部分功能移到 Spring 核心了。

    https://github.com/hantsy/spring-r2dbc-sample
    hantsy
        51
    hantsy  
       2020-12-15 17:53:32 +08:00
    @jeizas 和 Jdbc 一样,R2dbc 也是一套标准规范了(现在在 reactive 基金会下监管,https://www.reactive.foundation/projects),同样需要驱动实现。实现 MySQL 的 R2dbc 驱动已经不止一套了。
    hantsy
        52
    hantsy  
       2020-12-15 17:55:33 +08:00
    https://r2dbc.io/drivers/ 官网可以看到两套 MySQL 驱动了。
    tesguest123
        53
    tesguest123  
       2020-12-15 18:00:57 +08:00 via iPhone
    后台管理系统不要太香,又增加摸鱼时间。
    lewis89
        54
    lewis89  
       2020-12-15 18:08:53 +08:00
    @cmai #46 有体量了 肯定就不用 JPA 了..
    skypyb
        55
    skypyb  
       2020-12-15 18:11:35 +08:00
    我也喜欢 JPA, 但还是不得不选择 MyBatis, 因为 JPA 写那种带数据库特有函数的 SQL 挺麻烦的。。
    比如我用的 Postgres, 我要用那种 ts_rank 、to_tsquery 这种函数, 还带着大段的 WHERE 条件的话, 还是在 XML 里写漂亮清晰。

    要是 JPA 能支持文件写 SQL, 鬼才用 MyBatis
    myqa
        56
    myqa  
    OP
       2020-12-15 18:52:41 +08:00
    @jjianwen68 这个看起来可挺香的,之前写脚本语言的时候发现很多 orm 都是这么做的,貌似 java 也有类似的框架
    fxjson
        57
    fxjson  
       2020-12-15 19:09:49 +08:00
    单表查询 jpa,多表查询 querydsl, 谁用谁知道
    mmdsun
        58
    mmdsun  
       2020-12-15 23:42:58 +08:00 via Android
    @skypyb jpa 是可以写原声 SQL 的。而且可以写到外部文件 xml 里面
    skypyb
        59
    skypyb  
       2020-12-16 08:24:53 +08:00
    @mmdsun 求教怎么操作, 我之前查了好久没查到。
    myqa
        60
    myqa  
    OP
       2020-12-16 10:02:42 +08:00
    @skypyb 写在 xml 也没什么好,非常讨厌 xml
    写在注解上主要是太长了不好操作,不过感觉配合 ide 的感觉还行吧
    hantsy
        61
    hantsy  
       2020-12-16 10:38:12 +08:00
    JPA 从一开始就支持完全使用 XML 配置(orm.xml, persistence.xml 两个标准文件,目前一般应用服务器中 persistence.xml 是必须的,orm.xml 则是可选的,在 Spring 中使用更高级的 LocalContainerEntityManagerFactory 时,persistence.xml 也是可选的),只是很少人用,毕竟 Annotation 配置是大势所趋,下一代的 JPA 标准可能 persistence.xml 也和 Servelt,CDI 配置文件一样变成可选的。

    所有的 Entity Annotaitons 查询语句都可以转化成 XML 在 orm.xml 中写。

    这种纯 XML 配置方式有一种情况适合,比如 你设计的产品 Models 是中立的, 需要适配多种数据源(不一定是数据库,也可能是 RDBMS,或者 NoSQL ),Model POJOs 单独打包成一个 Module (可以是 JPMS 或者就是一个普通的 Jar ),当要使用 JPA 时,用外部化的 XML 配置来实现。
    Nillouise
        62
    Nillouise  
       2020-12-16 11:28:55 +08:00
    想问一下,用了 nosql 如 mongodb 跟 dynamodb 是不是就不用纠结 jpa 跟 mybatis ?
    mmdsun
        63
    mmdsun  
       2020-12-16 12:59:58 +08:00 via Android
    @skypyb 关键词是:XML Named Query Definition

    然后写 xml 就可以了。xml 有对应的标签支持原生 SQL 。

    <named-query name="User.findByName">
    <query>sql </query>
    </named-query>
    SkyLine7
        64
    SkyLine7  
       2020-12-23 15:11:04 +08:00
    mybatis plugins 永远滴神
    soulzz
        65
    soulzz  
       2021-08-26 08:57:48 +08:00
    jpa repo extends 一个 JpaSpecificationExecutor
    用 CriteriaBuilder 去构建一个查询不香到哪里去了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3030 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:01 · PVG 23:01 · LAX 08:01 · JFK 11:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.