1
gz911122 OP 问了几个朋友都表示不会使用除 spring 这种知名框架外的开源项目。
理由的后端要负责。。 但是也没见 nodeJs 之类的这么保守啊 |
2
Mogugugugu 2018-12-16 21:53:04 +08:00 via Android
Java 混了这么多年不就是保守么。。。虽然也有创新,但是企业开发,用了什么新框架,小众框架,要重新踩坑不说,开发人员离职了谁来扛旗谁来接锅,这也就是为啥企业喜欢成熟的大众化的,开发效率 性能固然重要,但是还是要看长远的。
|
3
Mogugugugu 2018-12-16 21:57:23 +08:00 via Android
mybatis 没人用?用啥? jpa ? hibernate ?还是那个 jooq ?可选择性也不多,Spring 全家桶就爱选 jpa,简单点可能会选 mybatis,入门简单,维护简单,坑也被踩得差不多了,hibernate 太重, 入门要求太高,用精了更难,新人来了不好接锅。。。
|
4
gz911122 OP @Mogugugugu
搜了一下 jpa 和 hibernate 都不少 https://pic4.zhimg.com/80/v2-de547253d3f964e3c6eae60e3ea351bf_hd.jpg |
5
gz911122 OP |
7
Sharuru 2018-12-16 22:11:22 +08:00 3
国内技术圈流行的东西和国外是有一定代差的。
就拿 Spring Boot 来说,注解配置都出来多久了,国内现在起手还是一个 xml 教你配置。 一方面语言是一种因素,另一方面我觉得百度上能搜到的教程都是屎;导致整体水准上不去。 其实 Hibernate 现在配合 Spring Data 足够易用了,简单需求可以只靠方法名就生成一堆搜索。 (然而之前还有帖子在说 ORM 是毒瘤,raw sql 才是王道。) 楼主既然眼界宽了一点,也就没必要自扰,喜欢一个用就完事儿了。 |
8
echo1937 2018-12-16 22:15:13 +08:00 via iPhone 14
和 pivital 工程师聊过这个问题,对方的回答是,国内很喜欢手写 sql,尤其是复杂的 sql,在这点上老外这个需求就少很多。
进一步询问,这些 sql 都是干啥的,p 厂的调研结果是,给领导提供数据啊报表之类的需求多,业务需求相关其实少。 |
9
HuHui 2018-12-16 22:17:28 +08:00 via Android
业务复杂度决定的吧
|
12
alcarl 2018-12-16 22:27:14 +08:00 via Android
国外的 java 历史比咱要早个十几年,遗留的东西和人也多,自然对新东西接受的就少一些。中国是从 2005 年左右起,互联网浪潮才开始有大规模的 java 开发,甚至到 2010 年以后才有大批量的新人入行,it 这行是什么新用什么是自然的。其实很久以前国内招 java 的基本全是要熟练 ssh 的,不过最近这些年 struts 基本没人用了,还经常出些大漏洞。hibernate 和 mybatis 相比要写很多框架需要的冗余代码,写小项目的效率不行,不适合雨后春笋般的互联网企业,spring boot 也是为了简化提高搭建效率而生的,很快就流行起来了。
从主观上说到底其实就一个原因码农天生的懒,懒癌晚期患者。。。。。。。 |
14
daimazha 2018-12-16 22:31:49 +08:00
楼主还是眼界放宽点吧。
Mybatis 在国外好像没人用? 楼主统计过吗? Mybatis 一直很保持更新,而且 commiter 大部分还都是外国人吧。 国内 Java 界在 GitHub 上不活跃? 看看 trending 吧, 可能一半都是国内开发者的项目。 |
15
CallMeReznov 2018-12-16 22:33:06 +08:00
@echo1937 有没有专门整合这种临时需求的报表工具或者方式
领导,或者运营,产品总是对后端数据展示这块设计需求不重视,产品都上线了还是让运维到线上数据库查,查完就拉倒也不跟开发说要加个类似的参数展示.过几天又想看那就又查. 就不能搞个什么东西给他们 让他们自己查,最好还有一定的自定义的空间 |
17
sagaxu 2018-12-16 22:50:05 +08:00 via Android 7
db 访问分为这么几种
1. 写 sql,各个 db 差异要自己适配 2. 写 dsl,屏蔽了 db 差异,自动适配 3. 运行时或编译时自动合成 sql,屏蔽 db 差异 mybatis 和 jdbc 是第一种,hql 是第二种,jpa 是第三种,开发效率依次递增,表达能力依次递减。在我看来,mybatis 已经是过去式了,jpa 可以满足 80%以上的需求了,少数交给 hql,极少数直接走 jdbc(temple)。 |
18
Narcissu5 2018-12-16 23:24:42 +08:00
我觉得还是数据集的原因吧,中国市场太大了,动不动就是百万千万日活的,超过大多数外国全国人口,数据上去了,对手写 sql 的需求就强烈了。面对大数据集的时候基本要求就是每条查询都要有索引,JPA 生成的那坨屎就用不上了
|
19
VEEX6 2018-12-16 23:40:50 +08:00
前不久我的团队就在用。。。虽然觉得有点土
|
20
MoHen9 2018-12-16 23:47:36 +08:00 via Android
我同事喜欢用 JdbcTemplate,几乎不用 mybatis,而我喜欢 mybatis 和 jpa,我觉得觉得 mybatis 好用,又是 orm 框架,使用好不用担心 SQL 注入和 null 值等情况,而他们觉得 orm 需要对应实体类,没有原生 SQL 灵活,想怎么拼就怎么拼。
|
22
szq8014 2018-12-17 08:59:25 +08:00 4
我个人觉得绝大多数的情况下 MyBatis 手写代码没什么优势,也就报表统计时能好一些。
怀疑用 MyBatis 初心是技术不自信不了解 Hibernate 又想掌握自己写的代码, 后来用烦了就开始写各种 generate 插件,活生生把 MyBastis 魔改成了 Hibernate 又不如 Hibernate。(装完逼就跑 |
23
CoderEQ 2018-12-17 09:01:20 +08:00 via Android
我们都在用,结果跟我们公司的国外团队协作开发时,他们说 ibatis 都过时十多年了,然后我就觉得他们可能是有误解,他们用 jpa,hibernate
|
24
echo1937 2018-12-17 09:13:16 +08:00
@szq8014 #22 确实,
没有 generate 插件,Mybatis 用起来挺烦的; 有了 generate 插件,Mybatis 多了一堆的 config,明明有使用更简单的 jpa 所以我这样的懒人,还是 jpa + JdbcTemplate 比较顺手一点。 |
25
chocotan 2018-12-17 09:14:11 +08:00
我也很久前就有这个疑惑了,歪果仁的统计里面 jpa/hibernate 永远是大头
我自己也是喜欢 jpa,写不需要特殊 sql 的项目简直是神器 @daimazha 随便发几个我看到的统计 https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application https://arjan-tijms.omnifaces.org/2018/05/java-ee-survey-2018-results.html |
26
zyj321321321 2018-12-17 09:16:35 +08:00
说到底,大家都想安逸一点。对于已有线上产品,平常产品经理给的需求就已经改的很恶心了,再换个自己不会用的,那不就是分分钟加班。只有当换个技术主管的时候,才会可能产生技术换代这样的操作。所以大部分稳定不死的老公司,技术迭代慢。才上班刚半年的渣渣的想法
|
27
arthas2234 2018-12-17 09:20:48 +08:00
@echo1937 业务需求 jpa 完全可以满足了,就是报表,往往要联合几个表做查询还有复杂的逻辑。报表我一般都是用视图封装起来,jpa 只用来查询封装好的视图
|
28
chinesedragon 2018-12-17 09:28:45 +08:00
JPA 联表查询时巨不舒服,有什么解决方法啊
|
29
youngxhui 2018-12-17 09:35:40 +08:00 via Android
@daimazha 在国外的占有率的确不高,可以说很低。中日韩三国喜欢 mybatis,其他国家喜欢 hibernate
https://www.zhihu.com/question/50729231/answer/549761974 |
30
gesse 2018-12-17 09:39:40 +08:00
用 java 的第一优势是稳定。国外人比较看重稳定吧, 加上人口少, 并发之类的可能考虑的少
|
31
daimazha 2018-12-17 09:47:18 +08:00
@chocotan #24 第一个比较有说服力,第二个样本太少了。Mybatis 更易学易上手同时性能也比 Hibernate 好。在国外比较流行可能是因为 Hibernate 更面向对象,同时对 Mybatis 的 xml 不爽。
|
32
CoderGeek 2018-12-17 09:49:56 +08:00
老外写复杂 sql 的少 - -
|
33
specture 2018-12-17 09:53:21 +08:00 1
@sagaxu 赞同。我现在带的这个项目思路就是类似的。有点参考 CQRS 的意思。核心业务层,增删改 jpa,这一块基本不会有自己写 sql 的需求,如果有,那极有可能设计不合理;报表,页面复杂试图的数据 jdbctemplate 直接撸 SQL。mybatis 其实是相对折衷的方案,都能做但是都不是那么舒服。
|
34
tatelucky 2018-12-17 09:53:54 +08:00
笑了,没有所谓过时不过时,只有适合不适合
|
36
gejun123456 2018-12-17 09:59:38 +08:00 via iPhone
堡垒之夜为何在国内不火 一个原因么
|
37
zpf124 2018-12-17 10:36:17 +08:00 1
确实国内外倾向比较不一样。
|
38
Lonely 2018-12-17 10:38:34 +08:00 via iPhone
感觉,感觉……有数据吗
|
40
zpf124 2018-12-17 10:43:29 +08:00
上面那个是两张图,都是一年内的搜索热度统计,第一张是全球的,第二张是中国的。
|
42
zpf124 2018-12-17 10:51:17 +08:00
然后我又试着搜了一下 14 年至今的趋势。
全球范围内, 所有的 ORM 相关的内容都是下降趋势的。 可能是因为 java 的热度也在下滑。原因应该是因为 node 引领的 js 的崛起和深度学习引领的 python。 而且值得一提的是,中日韩三国都更偏向 Mybatis。当然日本第一倾向居然是 裸写 JDBC。 |
43
zpf124 2018-12-17 10:58:47 +08:00
然后, 中国的搜索趋势就比较诡异了... 图形乱糟糟的像是心电图一样,波动都很大...
不过总体上,14 年底,mybatis 就领先了。 我鼠标 hover 出现的那个详情图挡住了一个重要变化,18 年 9 月的时候所有关键字都是热度降低的,但 mybatis 突然降低了一半左右。 有没有大佬科普一下发生了什么? Google 改变收录算法引起的? 还是国内当时有情况引发的趋势?又或者因为 9 月份开始找工作了,学生党顾不上搜了只剩工作党提供的热度了? |
44
zhyzhy 2018-12-17 11:04:50 +08:00
很好奇大厂的 Hibernate 是怎么用的
真的配置一堆 OneToOne,ManyToMany 吗? 我个人使用都是单表,遇到 join 只能放业务层代码里 join 了 |
45
southsala 2018-12-17 11:37:21 +08:00
我也好奇大厂 Hibernate 怎么用的,我也是业务层做逻辑关联,但是遇到过电商项目时配置 OneToOne 之类的,不用自己写关联语句,挺省事的
|
47
xAx 2018-12-17 13:00:39 +08:00
上面这些拿数据说话的,有想过你们列举的数据来源到底对不对吗?
大家上 google\github 十个有九个是开挂上的,九个里面还有八个要保隐私填非真实信息... 就搜索热度来说,统计结果仅能代表:坐飞机的程序员 && 被 google 真实定位。 不坐飞机的程序员 || 没有被 google 真实定位 都被你们当外国人了吗??? |
48
zjsxwc 2018-12-17 13:09:09 +08:00
从转 sql 与转 html 来看:
mybatis 类似与 前端 Vue JPA 类似与 前端 React/Angular |
50
HiJackXD 2018-12-17 13:25:07 +08:00 via iPhone
主要原因还是 hibernate 深入太难,不看看文档一不小心就会掉入性能深坑,比如多字段的数据更新,hibernate 的 update 默认是更新所有字段(无论其他字段有没有变)但其实可以配置好只更新有变化的字段。 但是文档主要是英文,国人大部分看起来肯定没外国人流畅。但 mybatis 都是自控 sql,没多少需要注意的坑。大家就这样觉得 hibernate 性能不行, 其实是自己不会用。。
|
51
yhvictor 2018-12-17 13:36:15 +08:00 via iPhone
楼上各位 如果性能不行为啥不上 nosql ?
|
52
kevinhwang 2018-12-17 13:39:11 +08:00 3
其实国内真的大部分是 mybatis,这是工程师素质导致的。
国内工程师英文比较差,较少读 api doc,遇到和 hibernate 和 jpa 的坑就会很无助。 而 mybatis 实现简单,直接查看源代码一步一步 debug 也能找出问题( hibernate 试试看)。 国外的趋势是对的,jpa 提高开发效率非常高。mybatis 和 jpa ( hibernate )都用过。 mybatis 开发慢,且注解方式非常不优雅,属于落后框架,但维护起来真的舒服。 hibernate 真的门槛比较高,若在并表的情况下(互联网很少),开发一时爽,维护火葬场。 个人看法是 hibernate+jdbc。mybatis 真的很落后,都什么年代了还 xml,注解又做不好。 |
53
shyangs 2018-12-17 13:43:38 +08:00
我選 JPA 和 React
::doge:: |
54
tatelucky 2018-12-17 13:43:48 +08:00
@gz911122 小厂无庸置疑,选择现成的轮子比价划算,市面上常用技术你得会,mysql+mybatis 目前成了大多小公司的标配,无论招人还是立项,这个是最节约成本的,好找人,会的人多,资料好找。大厂,能自研,自己也不会对你公开,你觉得用得少或者觉得,往往是第一感觉。学习他框架的核心,为所用,适合自己才是重点
|
55
whx20202 2018-12-17 14:28:57 +08:00
我觉得 jooq 还是挺好用的,只要你玩法不是特别的骚。
另外 springboot 也有了 jooq-starter |
57
xAx 2018-12-17 14:47:26 +08:00 1
@HiJackXD 光看比例这话倒也没错。
-------------------------------------- 不过,Mybatis 才是王道. hibernate 才是过时框架。 JPA 这玩意,好不好用完全看对应的业务需求。多表查询完全反人类。 Mybatis 通过自定义 LanguageDriver+注解的方式,不要太高效。 各种单表、连表、搜索都可以注解带个条件就搞定。 套用 hibernate 选手常用的一句话“说 hibernate 性能低是因为你不会”----“说 mbatis 开发效率低是因为你不会自定义 LanguageDriver ” |
58
BeFun 2018-12-17 14:54:28 +08:00
我之前小公司,自己做技术选型的时候用的就是 jpa,真的好用。现在换了比较大的公司,公司线上项目,还有基础项目都是 mybatis 的,你只能用,然后想推荐 JPA,然后老员工就会反对
我觉的有差别,主要还是在国情上吧 |
59
dbpe 2018-12-17 15:02:52 +08:00
JPA+QueryDSL 挺不错的
|
60
xpresslink 2018-12-17 15:27:37 +08:00
我觉得楼主没有调研过所以才这么说吧。
阿里巴巴连任 Java 全球管理组织席位, 2017 年度开源贡献榜 国内阿里排第一,世界第 9 这个两条新闻说明什么? 另外有一点说一下,在阿里 mysql 的使用有规定,禁止使用外键,存储过程、触发器、函数、视图、事件等 MySQL 高级功能 。 |
61
motai 2018-12-17 15:34:10 +08:00
觉得注解不一定好吧,有的时候,配置文件一改,重启就能用,注解还要重新编译
|
62
gz911122 OP @xpresslink 这跟大家讨论的问题有关系吗?
|
63
zander1024 2018-12-17 15:44:44 +08:00
做过一些老外的项目 ,性能要求没那么高,人需求调研也做的好 后面改起来伤筋动骨少一点。 业务逻辑也很清晰,大部分建好类 都是最基础的 sql。 至于国内的项目,需求就能改到你怀疑人生,各种脑残业务报表,sql 能写几页你信不?
mybatis 是写起来应对需求和脑残业务最舒服的了. 讲真 不是顾及开发效率,我很想手写 sql。 就是开发一时爽,维护火葬场。 2 页 sql 最后自己也看不懂了。 |
64
xpresslink 2018-12-17 16:13:23 +08:00
|
65
gz911122 OP @xpresslink 大家讨论的不是 mybatis 和 hibernate 谁好,讨论的是 是什么原因导致了国内外的差异。。。
|
66
niaobulashi 2018-12-17 16:46:29 +08:00
说实话,我用过 mybatis 之后,就再也不想用了
真的很不方便,开发效率底 |
67
arden 2018-12-17 17:24:58 +08:00
直接用 jfinal 或者 jboot,多方便。
|
68
beneo 2018-12-17 17:34:18 +08:00
上规模的企业才会自己写 SQL,一般小心公司 hibernate 足够了
|
69
abcbuzhiming 2018-12-17 18:31:41 +08:00
楼上这么多人都觉得 hibernate(JPA)好用,我想问一下各位,你们的公司都进化到不需要关系数据库做 OLAP 了,都是 OLTP 业务?如果是这样的话,那我只能说你们很幸运,这么说吧,国内 mybatis 流行的原因其实只有一个,大部分中小型公司都需要依赖关系数据库来进行 OLAP 业务,这恰恰是 JPA 等的弱项
|
70
abcbuzhiming 2018-12-17 18:37:29 +08:00
@beneo 你说反了,真心的。 国内只有小型公司才有各种奇葩需求需要你 OLAP,上规模的公司,需求流程都要求的很严格,反而可以用 JPA 解决大部分需求
|
71
wjl327 2018-12-17 18:51:37 +08:00
从 stack overflow 的 tags 来看,mybatis 确实远远少于 hibernate
|
72
l00t 2018-12-18 08:36:18 +08:00
@kevinhwang #52 都什么年代了还用 Hibernate,你知道十几年前国内 Java 最流行什么吗? SSH 啊,其中的 H 就是 Hibernate。后来大家纷纷都换成了 iBatis, 进而成了 MyBatis。一个坑多,难调试,难维护,生成的那坨东西神仙难懂还性能极低的框架,早扔早好。你说坑多=门槛高?我为什么要琢磨你这根本不该存在的门槛呢?
|
75
ala2008 2018-12-18 10:04:58 +08:00
业务基本都不是单表的。mybatis 直接写 sql 关联就行了。。jpa 也不错,但是公司业务决定了。。。
|
76
xAx 2018-12-18 10:22:51 +08:00 2
隔了一天又进这贴,突发奇想,导致国内外框架流行差异的原因: 老外 /国内某些公司 把业务复杂、各种关联关系的系统外包给中日韩?
自家员工就写些个业务简单的系统?或者,自家员工评估后发现,这系统不好做,赶紧外包出去? |
77
beneo 2018-12-18 14:21:51 +08:00
@abcbuzhiming 数据库是用来存储的,其它任何有点点分析的,都走的是类似 Hadoop 之类的
|
80
abcbuzhiming 2018-12-18 16:50:29 +08:00
@beneo 你起码是在 1 个中型规模以上的公司,或者专门以大数据为业的行业,去掉这两点外,大把的中小型公司压根就不上 Hadoop 之类的玩意。有钱的公司还是少数,穷逼公司是多数
|
81
abcbuzhiming 2018-12-18 16:54:14 +08:00
@beneo 另外,就算不做分析,联表查询仍然是很常见的现象,Hibernate 和 JPA 搞联表真心和吃翔一样。哪怕最简单的联表查询也是
|
82
Narcissu5 2018-12-18 17:05:38 +08:00
比方说上来一个请求,PUT /item/1111 要更新价格,直接用 sql
```sql UPDATE items SET price = 11 WHERE id = 1111 ``` 如果用 Hibernate,得先吧实体查出来,更新,在放回去。而且每次操作都涉及到所有字段,如果是宽表,生成的 sql 有点感人。即使是简单的查询,mybatis 也可以通过限定字段来避免回表查询。当然这些 hibernate 也可以做到,但真的,比 mybatis 麻烦多了。 |
84
beneo 2018-12-18 18:12:22 +08:00
@Narcissu5
@abcbuzhiming 复杂 SQL,比方说各种 JOIN 手写 SQL 是不错的 主要还是开发效率,HIbernate 真的比 Mybatis 不知道搞了多少。 没有 500W 用户的业务我觉得 Hibernate 足以 |
86
Sanko 2019-01-13 22:02:41 +08:00 via Android
所以说,我要学哪个
|
89
ymstars 2019-03-30 21:23:21 +08:00 1
看了这么多回复。忍不住了!
1. hibernate 历史悠久并不代表过时,mybatis 这种方式就是未来吗?肯定不是。数据库就是用来存数据的,联表查询一大堆只能说明数据结构设计是有问题的,只是不愿承认或者心里没底而已,竟然还有人为了排序筛选数据,把复杂的运算放到关系型数据库去做,咋不上天呀,你这是叫格力的仓管大爷去替你拿材料,顺便让他根据各种因子计算新型压缩机的功率损耗。数据分析就不应该让关系型数据库做,这叫各司其职。 2. @Narcissu5 这条语句的逻辑很有意思:“ UPDATE items SET price = 11 WHERE id = 1111 “,难道你公司更新数据的时候不需要先取出数据再更新吗?对了,但凡有一点点的并发需求,无论是乐观锁还是悲观锁,都需要查询到最新的数据不是吗,悲观的加锁,乐观的核对 Version。至于全字段回写数据库,只是不知道有这种操作而已,hibernate 明明可以指定局部字段更新的好吗 3. 报表逻辑真实存在!这也许是一种让程序员通过关系数据库把数据分析这活也干了的一种借口吧,程序员可不要乐在其中哦 4. 微服务都大行其道了,还在狂钉外键,一大堆联表查询,sql 语句多达几百行,想想都忍不住噗。定义好业务边界,拆分成独立子系统吧,不然到了一定规模,别说 hibernate 干不了这活,mybatis 手写 sql 又咋样,同样干不了,不信你给某个大厂的高流量数据钉个外键试试,看他们技术总监会不会拿刀追着你。小公司规模往往远没有达到那种撑不住的程度,大厂的高访问量业务数据早已不是这里逼逼的联表查询了。。。 5. 如果公司的数据库要从 mysql 转移到 Oracle 或者 sqlserver 或者其他的数据库,用 mybatis 的,就问你慌不慌吧。spring 官方支持 jpa 并不是没有依据的,jpa 屏蔽了底层差异。 既然 Jpa 用起来省心,没必要硬跟某些大厂的步伐,一步两步,似魔鬼的步伐! 就像淘宝技术十年里说的: 如用户模块,老的 member.taobao.com 继续维护,不添加新功能,新功能在新的模块上开发,跟老的模块共用一个数据库,开发完毕之后放到不同的应用集群上,另开一个域名 member1.taobao.com ,同时再替换老的功能,替换一个,就把老的模块上的功能关闭一个,逐渐把用户引导到 member1.taobao.com ,等所有的功能都替换完之后,关闭 member.taobao.com 上。从设计上来看,这个 member1 的二级域名应该是一个过渡状态,但我们把 member 域名的代码下线以后,发现很难把 member1 切换回 member,因为有些地方把链接写死了,于是后来很长时间里我们都是在用 member1.taobao.com 这样奇怪的域名。一年后,有另外一家互联网公司开始做电子商务了,我们发现他们的域名也叫 member1.xx.com 、auction1.xx.com ,复制得毫无保留,我们只能会心一笑。 |
90
Narcissu5 2019-03-30 22:58:23 +08:00
@ymstars 如果操作是幂等的为什么不能直接更新。我当然知道 hibernate 可以局部 select 或者更新,问题是写出来真的能看?遇到 insert..select,update..join 这样的操作 hibernate 能做?
为什么不用连表查询?如果只是单表查询 nosql 做得比关系型好多了。但是关系型活得好好的,为啥?因为 JOIN 确实牛逼啊,因为 JOIN 确实牛逼啊,因为 JOIN 确实牛逼啊。重要的事情说三遍。我也反对过多的 JOIN,但是合理的 JOIN 确实是任何 nosql 都不能企及的银弹啊,join 没错,只是被滥用了而已。再说了微服务和外键有什么关系,外键和 join 又有什么必然联系 |