求推荐一个Java好用的orm,为什么都那么难用。。

kinuyツ-avatar

kinuyツ

2022-05-05T19:02:28+00:00

用过mybatis,还要自己封装SQL,真是活久见了。以前用c# 的EFcore和sqlsugar,一行SQL都不用写,完全用lambda表达式和linq,代码也易维护。

是因为Java没有表达式树这种结构吗。。为什么Java都更新到17了,还没有解决这种底层很基础的东西
Nodi-avatar

Nodi

??? [s:ac:咦] [s:ac:咦]钓鱼?
kinuyツ-avatar

kinuyツ

[quote][pid=608699777,31794400,1]Reply[/pid] Post by [uid=60575022]go_c[/uid] (2022-05-07 03:22):

??? [s:ac:咦] [s:ac:咦]钓鱼?[/quote]?我为什么钓鱼了,职场区大佬很多吧
Kibishi-avatar

Kibishi

hibernate ,orm怎么可能没有嘛[s:ac:汗]
ExoticRxftz-avatar

ExoticRxftz

不想写sql?mybatisplus或者springdatajpa,话说我用了这么多框架,还是觉得手写sql容易维护啊。为啥你会这么觉得
UnknownAbnormal-avatar

UnknownAbnormal

mybatis-plus
如果你业务不是很复杂,就可以一句sql都不写。
Miza-avatar

Miza

你要的那个叫mybatis plus。 还有java正统ORM是hibernate
looksgoodnaked-avatar

looksgoodnaked

hibernate?jpa?
哪有直写sql方便啊?
Miza-avatar

Miza

老是见你发嘲讽java的帖子。。。为什么你觉得生态吊打c#的java社区会没有这些东西。。。你要吹吹语言级别的特性,都还算正常
kinuyツ-avatar

kinuyツ

[quote][pid=608713312,31794400,1]Reply[/pid] Post by [uid=62606394]qdlkjh[/uid] (2022-05-07 08:08):

老是见你发嘲讽java的帖子。。。为什么你觉得生态吊打c#的java社区会没有这些东西。。。你要吹吹语言级别的特性,都还算正常[/quote]并不是嘲讽啊。。只是在知乎搜这个问题,给的回答大多数是这样

[url]https://www.zhihu.com/answer/2249963848[/url]


MyBatis/MyBatis Plus又不是ORM,他就是个DBUtil,顶多解决了因为Java多行文本长期确实导致使用JDBCTemplate之类的工具不方便的问题,对应到C#那边大概就是ADO.NET+AutoMapper。

至于JPA,其实有个根本问题,Java的泛型运行时是拿不到类型的,没办法解析这个类型拿到名称跟数据库内容来对应,同时Java也没有扩展方法这个设定,没办法给一个bean凭空加一堆空方法,然后根据方法名去解析SQL,也没运算符重载不能使用运算符去生成SQL,像Ebean之类的做法是使用maven插件给每个实体类生成一个对应的里面有一大堆方法的类,直接用这个类来执行,算是解决了一部分,但是还是做不到C#那么彻底。

对了,其实这个跟泛型擦除没关系,C#对于class也是擦除的,对struct才是模板的,而Java的泛型并不支持原始类型,实体类也一定是class,所以其实是一样的,根本问题是,Java不是在全部情况下都把泛型类型编译进元数据里,印象中像入参泛型之类的才会被编译进元数据里,而C#是不管什么情况都给编译进元数据里,Emit一定能拿到泛型类型。Java那边甚至直到Java8才给了个编译选项可以保留参数名称呢,而且必须在编译时手动启用,默认不启用。

当然,C#保留泛型信息本来是给运行时做类型检查的。

不过Hibernate那种,明明已经把关系映射成对象了,操作的也确确实实是对象,却要写一个跟SQL语句差不多的字符串的设定也是奇葩,映射到对象是因为对象有语法检查,这又变成了字符串不是没意义了么。

Spring Data JPA也挺奇怪的,用一个方法名来解析成一条SQL语句。

其实欧美那边也一直在努力,也有Ebean,JOOQ,QueryDSL等等,虽然都还比不上,不过国内就是另一种情况了,国内的Java氛围是不认ORM这一套的,坚决不ORM,就直接写SQL。

实际上,国内的Java环境,Java5版本可能就够用了,以后的特性,一概一句语法糖,然后露出一副不屑的表情,其实我寻思着也可以用Java5以前的版本,毕竟按照这个来推算,注解也是个语法糖。而且国内酷爱把MyBatis叫做ORM,不知道怎么想的,好歹把JDBCTemplate和Commons DbUtils叫成ORM的不多。

另外国内大部分使用MyBatis的人,不是因为它多好,而是就会这一个,而且不想学别的。至于所谓MyBatis的优缺点,其实看知乎上相关回答就知道了,xml屎山问题,答可以拼接字符串写在注解里,JPA也能写SQL,答只能写字符串拼接,不能写在xml里,嗯~~~

还有一个MyBatis常被提到的所谓的优点,xml可以直接改,上古的非Spring Boot项目倒是确实可以直接改,但是项目依旧要重启,Spring Boot是打包进去的,而且,线上项目能直接改这事儿竟然被当作优点也是不可思议。

ORM解决了至少80%的需求,剩下的再写SQL好了,但是国内Java的普遍氛围是,因为ORM不能解决全部问题,所以,那80%要扔掉。
Miza-avatar

Miza

Reply to [pid=608714450,31794400,1]Reply[/pid] Post by [uid=8694089]满天星莹[/uid] (2022-05-07 08:15)
你这通篇都是java哪哪不如c#,还不是来嘲讽的?
ORM翻译过来就是对象关系映射,mybatis为什么不是?
java语言级别是有缺陷,不习惯可以去用c#,你这就不是来要解决问题的态度
jinyuu-avatar

jinyuu

你一开始就用过最牛逼的东西了,自然觉得其他都不行。
.net的EFCore吊打其他所有ORM
achong-avatar

achong

Java也有lamda啊,不过java没有linq……java有orm,不过确实没有微软的好用是真的……
Hectic Ren-avatar

Hectic Ren

不太懂,反正几年前一般还是直接写SQL的多,因为比较好优化

orm封装太蠢
Evanthe3-avatar

Evanthe3

JOOQ是不是能满足你的要求
Jovial-avatar

Jovial

我觉得还是想用啥用啥,既然觉得c#好那你直接封装独立服务调不就行了,没必要科普这些有的没的。。
blankfiji-avatar

blankfiji

laravel 的 orm 是我用过最好的。
php 天下第一。[s:ac:上]
Akiel Koh-avatar

Akiel Koh

想问问楼主对js的一个框架typeorm什么看法,算不算orm。[s:ac:茶]

查了下EFcore怎么写的增删改查,类似的写法mybatis-plus的lambdaQueryWrapper也是实现了的,实际也可以做到基本功能不写SQL,复杂的再写
WarWolf-avatar

WarWolf

稍微复杂点的业务还是直接写sql来的快。。。
JEFF-avatar

JEFF

mybatis + 挺好用的啊。还是说我自己要求低?