未来可能会取代 mybatis 成为 java orm 第一选择 当然不适用 springboot 的话就不好说了
1 taogen 2020-12-14 20:44:50 +08:00 via Android ![]() 我选 mybatis plus |
2 fxjson 2020-12-14 20:50:06 +08:00 一直看好 jpa, 但是,但是,国内好像用 mybatis 的多 |
![]() | 4 manami 2020-12-14 21:50:08 +08:00 用过都说好 |
![]() | 5 sue0917 2020-12-14 22:18:42 +08:00 via Android ![]() 国内 mybatis,vue 国外 jpa reactjs |
![]() | 6 chendy 2020-12-14 22:21:49 +08:00 遇到不靠谱的产品乱改,模型稳定不下来,jpa 就远没有 mybatis 好用了 另外,mybatis 不是 orm 。。。 |
![]() | 7 liyhu 2020-12-14 22:26:02 +08:00 mybatis 永不为奴 |
![]() | 8 beginor 2020-12-14 22:29:33 +08:00 via Android jpa 可以做到完全的强类型, 这一点 mybatis 做不到 |
11 optional 2020-12-15 08:41:34 +08:00 via Android ![]() java 的语言特性,支持不了多好的强类型 orm,最后还是得靠 sql 修修补补。 吐个槽 jpa 连个 upsert 都不敢支持 |
13 Sharuru 2020-12-15 08:46:45 +08:00 via Android ![]() 归根结底还是要看项目设计。 有点像前几天社区里讨论的国内流行 CentsOS,国外流行 Ubuntu 那样的感觉。 系统符合 DDD 的,JPA 一把梭就出来了,甚至只靠方法声明就能查数据,但这种对 Modeling 的要求很高。 MyBatis 国内吃香主要还是因为业务复杂程度所致,各种神秘连表。 一般来说,正常项目都会同时引入 JPA 和 MyBatis,简单查询以及插入用 JPA,复杂,要调优的用 MyBatis 。 此外,其实 JPA 也是可以发行 Native SQL 进行查询的,只不过写起来没 MyBatis 那么直观就是了(映射,条件判断之类)。 |
![]() | 14 nutting 2020-12-15 08:59:54 +08:00 对,关键是这个 DDD,国内或者说业界不流行这个,都是围绕数据库设计 |
16 EminemW 2020-12-15 09:08:33 +08:00 via iPhone 查询实体某些字段的时候,要用 Map 接收,或者弄一个接口只写 get 方法,这种方式觉得很怪 |
![]() | 17 sagaxu 2020-12-15 09:29:14 +08:00 via Android jdbctemplate 永不为奴 |
![]() | 18 graffitist 2020-12-15 09:36:59 +08:00 我们用的是 jpa 做增删改,通过解析 xml 用 jpa 的 Native SQL 来连表查 |
![]() | 19 myqa OP @sagaxu 我们一直用 jdbctemplate,感觉手写 sql 很多问题都不存在了,但是做业务系统有点累还是得 orm |
![]() | 21 mmdsun 2020-12-15 09:46:16 +08:00 2020 年,jpa 对 2 表联合查询,只取部分字段的支持怎么样 ?记得以前 jpa 用连表还得配置一对多,多对一,不然 join 直接报错。 感觉 jpa 配置不好,性能很难优化,经常出现 n+1 查询情况。 现在 jpa 使用还是要配置一对多,多对一么? |
![]() | 22 ghostsf 2020-12-15 10:02:10 +08:00 综合一下 mybatis plus +1 |
24 Yano 2020-12-15 10:03:36 +08:00 jpa 对单表简单的增删改查还是很爽的~我现在小的项目是 jpa,涉及复杂的再用 jdbcTemplate,其实我感觉 jdbcTemplate 也很简单呀~也很灵活。 |
![]() | 25 kaiz1121 2020-12-15 10:05:03 +08:00 不管 mb 还是 jpa 都是 crud 手动狗头 |
![]() | 27 lewis89 2020-12-15 10:33:06 +08:00 @mmdsun #21 只取部分字段? 要用覆盖索引吗?说实话实际上快不了多少,除了背八股文喜欢这么背,真实项目里面基本不用覆盖索引 |
![]() | 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 的功能,这点我不太喜欢。 |
![]() | 29 myqa OP @echo1937 想当年一开始是 Hibernate 比较流行,后来嫌弃他性能慢(主要是乱用),都用 mybatis,现在 Hibernate 伪装成 spring data jpa 又回来了,真是因吹斯听 |
![]() | 30 q149072205 2020-12-15 11:07:31 +08:00 jpa 谁用谁知道。用了根本停不下来。。 |
![]() | 31 mmdsun 2020-12-15 11:17:06 +08:00 |
![]() | 32 lewis89 2020-12-15 11:24:37 +08:00 @mmdsun #31 这..需要控制这么细致吗 QueryDSL 是可以生成 condition 对象的,无非是要手写代码判断是不是要把这个 condition 加进去... |
![]() | 33 Saurichthys 2020-12-15 11:26:05 +08:00 用 nutz dao 丝滑 |
![]() | 34 myqa OP @Saurichthys 前提得用 nutz,不过感觉始终是小众框架,类似于 php 上的 tp |
![]() | 35 a719031256 2020-12-15 11:34:39 +08:00 看好 mybatis plus,过度方便,jpa 以前用过,现在忘完了。。。。 |
![]() | 36 Saurichthys 2020-12-15 11:41:27 +08:00 @myqa 不用的呀,现在直接 springboot 加一个 nutz-starter 的依赖就行了 |
![]() | 37 myqa OP @Saurichthys 哦哦我五年前用过还没这东西,不过感觉还是 jpa 好毕竟学习资料多 |
![]() | 38 zhouyou457 2020-12-15 11:49:12 +08:00 虽然前期看起来不用写 sql 很美好,但是等业务量(瞎改)一上来的时候需要写各种关联 sql 的时候就恶心了。 别问我为啥,现在看着手头的产品的源码就头疼。代码版本才到 1.5 就已经难以维护了,service 层各种拼接 SQL 字符串。 |
![]() | 39 wangyanrui 2020-12-15 12:00:37 +08:00 via Android DDD 的 CQRS 了解一下 |
40 hantsy 2020-12-15 12:26:42 +08:00 ![]() 十年前就取代了。 用 JPA 的最好去正经的看一本 JPA 的书,比 Pro JPA2,Java Persistence with Hibernate (这个是 Hibernate 作者写的) 等。JPA 是一套完整的 Java Persistence 方案体系,不是简单的取代 SQL 。如果在你在报怨 Hibernate 性能, 在埋怨 Hibernate 执行效果你不如你写的 SQL,如果你不是 SQL 方面专家,对于 95%以上的人都是伪命题,你根本就没正经的用过 Hibernate 。 再说句费话,只有中国人在用 Mybatis 。 |
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 更少,当然一半是听都没听说过。 |
![]() | 42 wangyanrui 2020-12-15 12:49:10 +08:00 国内还是面向数据库编程的比较多 另说一个很现实的情况: 中小型公司,其实更会在乎 SQL 到底怎么写,要不要 SELECT 某几个字段,或者怎么 JOIN 等等 大体量的公司,单说 DB 层面,起码见过的几家国内大厂,都是 SELECT * ,然后自己在代码里实现简单的 JOIN 复杂 JOIN 不是 CURD boy 负责的事情,有专门的数据部门抽取到 Hive 之类的去单独处理 加机器远比优化代码要来的迅速,不行就上 TiDB 之类的东西,而且 SELECT 某几个字段和 SELECT * 并没有想象中那么大的性能差距(当然不回表的除外) |
47 jjianwen68 2020-12-15 17:28:16 +08:00 那么,你们开始使用 spring r2dbc 了吗 |
48 jeizas 2020-12-15 17:41:47 +08:00 @jjianwen68 mysql 还是没官方支持 |
49 hantsy 2020-12-15 17:44:52 +08:00 @jjianwen68 还不能完全代替 Jdbc 。 |
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 |
51 hantsy 2020-12-15 17:53:32 +08:00 @jeizas 和 Jdbc 一样,R2dbc 也是一套标准规范了(现在在 reactive 基金会下监管,https://www.reactive.foundation/projects),同样需要驱动实现。实现 MySQL 的 R2dbc 驱动已经不止一套了。 |
52 hantsy 2020-12-15 17:55:33 +08:00 https://r2dbc.io/drivers/ 官网可以看到两套 MySQL 驱动了。 |
53 tesguest123 2020-12-15 18:00:57 +08:00 via iPhone 后台管理系统不要太香,又增加摸鱼时间。 |
![]() | 55 skypyb 2020-12-15 18:11:35 +08:00 我也喜欢 JPA, 但还是不得不选择 MyBatis, 因为 JPA 写那种带数据库特有函数的 SQL 挺麻烦的。。 比如我用的 Postgres, 我要用那种 ts_rank 、to_tsquery 这种函数, 还带着大段的 WHERE 条件的话, 还是在 XML 里写漂亮清晰。 要是 JPA 能支持文件写 SQL, 鬼才用 MyBatis |
![]() | 56 myqa OP @jjianwen68 这个看起来可挺香的,之前写脚本语言的时候发现很多 orm 都是这么做的,貌似 java 也有类似的框架 |
57 fxjson 2020-12-15 19:09:49 +08:00 单表查询 jpa,多表查询 querydsl, 谁用谁知道 |
![]() | 60 myqa OP @skypyb 写在 xml 也没什么好,非常讨厌 xml 写在注解上主要是太长了不好操作,不过感觉配合 ide 的感觉还行吧 |
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 配置来实现。 |
![]() | 62 u2r1Hqo6HExmNsrt 2020-12-16 11:28:55 +08:00 想问一下,用了 nosql 如 mongodb 跟 dynamodb 是不是就不用纠结 jpa 跟 mybatis ? |
![]() | 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> |
64 SkyLine7 2020-12-23 15:11:04 +08:00 mybatis plugins 永远滴神 |
65 soulzz 2021-08-26 08:57:48 +08:00 jpa repo extends 一个 JpaSpecificationExecutor 用 CriteriaBuilder 去构建一个查询不香到哪里去了? |