国内的 Java 体系真的很落后吗?

2 天前
 zsmile

看到别人说推荐一个 java 架构,默默想了下好像在公司里面看到的大多数都是 springBoot+mybatis 的形式,DDD 推出后好像也没看到什么公司用,是只有大公司在用吗?那现在国内外比较新的 java 架构都有啥呢?

11340 次点击
所在节点    Java
130 条回复
gaojiangouyu
1 天前
在.NET 用过 ef core 的人再用回 mybatis ,真的觉得恶心
diagnostics
1 天前
数据库访问一般就是两个门派:

- JPA 、Hibernate 等 ORM:这类就是解决大部分 CRUD 需求的,简单的查询,涉及到多表,复杂查询就会性能低下,上手门槛也更高
- JDBC Temple 、MyBatis 、JOOQ 这类 SQL Helper:这类就是解决复杂查询的,因为本来就是 SQL ,想咋写就咋写


因为本来就是 SQL ,因此先说说第二类的发展历程,一开始大家写 JDBC 还好,写多了发现模板代码太多了,主要是两个层面,一个是连接这边的代码,一个是 ResultSet 做数据转换的代码,所以诞生了类似于 Apache Commons DbUtils 这种工具来简化,在 Spring 环境中则是 Spring JdbcTemplate 。

接下来事情就会朝着两极发展,还是先从 SQL 说起

Commons DbUtils 、JdbcTemplate 这类框架只简化了连接和响应映射,在动态 SQL 的支持比较少,因此诞生了 MyBatis 也就是 JdbcTemplate 高级版,通过模板引擎解决动态 SQL ,并且支持预定义的一些 SQL

当然 Mybatis 被人诟病的 XML ,还有动态能力在复杂场景还是有限的,例如写一个递归形式的动态条件(再举个例子,DAO 方法只穿入一个 filter ,这个 filter 可以是普通的 KeyValue 过滤,也可以多个 KV 组成的 AnyOf 和 AllOf 多重过滤,后两者对应的就是 id in (select id from t where f1 and/or f2 and/or f3...),这里面还可以动态拼接,我认为这种在 Java 里要用多态和类型匹配去做,MyBatis 对这个支持就不太行)

讲完了问题,就引出解决 MyBatis 这个陈旧框架的升级版 JOOQ ,这里用 TypeSafe 的 API 来编写复杂 SQL ,一来不需要频繁和 SQL 直接交互( Mybatis 也有一些这种痛点),也能避免出错;二来动态能力增强了,我能在 Java 代码而不是 XML 了编写内容。

到这里就是 SQL 帮助类这一方向发展的极端了(如果有更好的框架,可以提出),这里没有提到其他帖子的注入 MyBatis Plus (Join ),tk mybatis 等增强,而是因为他们要做的事情和 JPA 类似。

接下来谈谈 JPA ,JPA 的诞生我认为是解决 Commons DbUtils 、JdbcTemplate 这类框架中,对于一个表应该有的大部分普通操作 CRUD 没有预定义好一些模板代码,导致用户又需要频繁去写 findById ,findAll ,findCountByXXX 等操作(如果直接用 MyBatis ,也有这个问题,因此没有一个方案是一劳永逸的),简单来说我认为 JPA 就是用面向对象的方式编写简单查询,然后无感生成对应的模板 SQL 。但是这里的问题在于,JPA 这种注解时,方法名编写查询的方式,注定写不了复杂 SQL ,这又是一个新的问题。

总结,合并,从整个历程来看,数据库访问技术里,最终是趋向两个方向:简单查询自动生成、复杂 SQL 查询代码动态化,一个是前期需求,一个是后期需求。

以 MyBatis 和 JPA 举例,这两个框架都诞生了融合二者的三方框架:

- MyBatis Plus/ Mybatis Plus Join/ tk.mybatis
- JPA Criteria API, JPA QueryDSL

JPA/Hibernate 不能替代 SQL 。您应该充分利用 JPA 和 SQL ,并将它们组合成一个成功的解决方案。
MyBatis + 自动生成类增强插件似乎可行,但 MyBatis 自身的 SQL 能力不够强力,加上生成框架大部分就是国人写的,我并不是说国人的技术能力不行,而是国内这个职场氛围和文化,诞生不出来好的框架,原因有很多:996 、35 毕业、生存压力(投放广告),相对于 QueryDSL 、JOOQ 而言,国内的插件生态,文档不完善,功能不丰富。。。
sagaxu
1 天前
@diagnostics
@kbyyd24

JOOQ 很好,但是贵啊,免费版有两个致命不足,专业版年费 3000 元,企业版年费 6000 元,按运行设备算。

1. 免费版不支持 oracle, sqlserver 等商业 DB 。曾经我有个奇葩项目买的起 db2 却没预算买 JOOQ 。
2. 免费版只支持最新版本的开源 DB ,想用 MySQL 5.x ,要么加钱要么用老版本。

如果没有这两个限制,使用要广泛的多。
xuanbg
1 天前
编程领域最基本的数据结构和算法,都是几十年没变过的东西了。年龄比你爹还大,我就问你老不老?你只需要把这些老得不能再老的东西学明白,写代码就能做到随心所欲。想写 Java 写 Java ,想写 Go 就写 Go 。当你真的学会了编程而不是编程语言、框架、三方库,什么新鲜工具你还能玩不转?
miaotaizi
1 天前
@xuanbg 楼上的在理

一帮子人成天这框架, 那架构的, 看着都烦
roundgis
1 天前
@sagaxu 用這玩意通常是客戶埋單的
ZGame
1 天前
@billbob r2dbc 可一点都不好用啊 ,Mono 响应式那种更恶心
fantasy0v0
1 天前
有没有哪个 ORM 或者 db tool 能实现这个效果呢?
fantasy0v0
1 天前
@fantasy0v0 const { id, name } = select id, name from student; 变量 id 和 name 的类型与 sql 返回的对应的列的类型一致。
TanKuku
1 天前
JOOQ + kotlin 不知道多好用
Pursue9
1 天前
用 Mybatis-Plus ,简单的 CURD 不用写 sql ,复杂的查询用 sql
witcherhope
1 天前
说的对,这些框架玩意换汤不换药,有没有新东西看 CS 论文有没有新概念提出
xiaoheshang
1 天前
够用就行,一般说这个落后那个落后的,都是面向简历编程。
gejun123456
1 天前
mybatis 可以试试 intellij 的 MybatisCodeHelperPro 插件,大幅提升 mybatis 开发效率,写 sql 几乎所有地方都有代码提示,还有很多生成代码,代码检测,开发效率不比其他 orm 低
xiaomushen
1 天前
如果去掉了 MyBatis ,就不落后了
angryfish
1 天前
现在的项目用 mybatis plus ,简单 sql 不用写,复杂的查询才需要。完全感觉不到落后。
chuck1in
1 天前
我来啦。
harryWebb
1 天前
天天技术落后啥的,国外一把梭哈干的不比国内少。。。

工资涨没涨?划水时间太多?

有那闲工夫多考虑考虑生活,别天天盯着技术落后不落后,落后又能咋滴

时代车轮肯定会进步的,太正常了
gowk
1 天前
DDD 的一些概念还是不错的,但是应用门槛比较高,全盘 DDD 就是给自己找不痛快
Why I don't do Domain Driven Design
https://news.ycombinator.com/item?id=42539477
heliotrope
1 天前
看过 JOOQ 的 API
没感觉和 mybatis plus + join 有什么大的区别 不都能 LINQ 式的操作数据库么
以前 join 不能自关联 什么的 还自己改了代码去实现 现在大部分功能都完善了
实在复杂的 SQL 还能 XML
XML 是不优雅 是不好用 问题是有的业务它就是得 XML

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1103584

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX