myqa
V2EX  ›  Java

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

  •  3
     
  •   myqa · Dec 14, 2020 · 11837 views
    This topic created in 2162 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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

    用过 ElipseLinks, OpenJPA 更少,当然一半是听都没听说过。
    wangyanrui
    wangyanrui
    Dec 15, 2020
    42
    国内还是面向数据库编程的比较多

    另说一个很现实的情况:

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

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

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

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

    要是 JPA 能支持文件写 SQL, 鬼才用 MyBatis
    myqa
    myqa
    OP
    Dec 15, 2020
    56
    @jjianwen68 这个看起来可挺香的,之前写脚本语言的时候发现很多 orm 都是这么做的,貌似 java 也有类似的框架
    fxjson
    fxjson
    Dec 15, 2020
    57
    单表查询 jpa,多表查询 querydsl, 谁用谁知道
    mmdsun
    mmdsun
    Dec 15, 2020 via Android
    58
    @skypyb jpa 是可以写原声 SQL 的。而且可以写到外部文件 xml 里面
    skypyb
    skypyb
    Dec 16, 2020
    59
    @mmdsun 求教怎么操作, 我之前查了好久没查到。
    myqa
    myqa
    OP
    Dec 16, 2020
    60
    @skypyb 写在 xml 也没什么好,非常讨厌 xml
    写在注解上主要是太长了不好操作,不过感觉配合 ide 的感觉还行吧
    hantsy
    hantsy
    Dec 16, 2020
    61
    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
    u2r1Hqo6HExmNsrt
    Dec 16, 2020
    62
    想问一下,用了 nosql 如 mongodb 跟 dynamodb 是不是就不用纠结 jpa 跟 mybatis ?
    mmdsun
    mmdsun
    Dec 16, 2020 via Android
    63
    @skypyb 关键词是:XML Named Query Definition

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

    <named-query name="User.findByName">
    <query>sql </query>
    </named-query>
    SkyLine7
    SkyLine7
    Dec 23, 2020
    64
    mybatis plugins 永远滴神
    soulzz
    soulzz
    Aug 26, 2021
    65
    jpa repo extends 一个 JpaSpecificationExecutor
    用 CriteriaBuilder 去构建一个查询不香到哪里去了?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   864 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 22:26 · PVG 06:26 · LAX 14:26 · JFK 17:26
    ♥ Do have faith in what you're doing.