感觉 spring jpa 使用越来越广泛了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
myqa
V2EX    Java

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

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

    未来可能会取代 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 都不敢支持
    MIUIOS
        12
    MIUIOS  
       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,国内或者说业界不流行这个,都是围绕数据库设计
    MIUIOS
        15
    MIUIOS  
       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 配置来实现。
    u2r1Hqo6HExmNsrt
        62
    u2r1Hqo6HExmNsrt  
       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     Solana     5452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:19 PVG 09:19 LAX 18:19 JFK 21:19
    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