未来可能会取代 mybatis 成为 java orm 第一选择 当然不适用 springboot 的话就不好说了
1
taogen 2020-12-14 20:44:50 +08:00 via Android 3
我选 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 3
国内 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 1
java 的语言特性,支持不了多好的强类型 orm,最后还是得靠 sql 修修补补。
吐个槽 jpa 连个 upsert 都不敢支持 |
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 那么直观就是了(映射,条件判断之类)。 |
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 1
十年前就取代了。
用 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
Nillouise 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 去构建一个查询不香到哪里去了? |