大家喜欢用 ORM 还是直接写 SQL

2023-12-29 12:50:20 +08:00
 gitrebase

OP 主要用的 Java 和 Go ,但是感觉这俩主流语言的 ORM 框架( JPA 、GORM )都不如 C#、Python 的 ORM 好用( JOOQ 、ent 、XORM 感觉国内用的还是有点少),而 SQL / SQL builder ( JdbcTemplate 、sqlx )在动态条件查询时需要在代码里拼 SQL 字符串也有点🥚疼

其实就是最近在玩 Spring 新出的 JdbcClient ( JdbcTemplate 的封装版),感觉在 Java 有多行字符串后,在 Java 代码里写 SQL 完全不是什么问题,而且也不用使用难用的 XML 去定义 resultMap (直接在 Java 里定义 record 或者 class 然后用构造器就可以了)

public record User(Long id, String name, Integer sex) {
}

@GetMapping("/users/in")
public Iterable<User> listInIds(@RequestParam List<Integer> ids) {
    return jdbcClient.sql("""
            SELECT *
            FROM `user`
            WHERE `id` IN (:ids)
            """)
            .param("ids", ids)
            .query(User.class)
            .list();
}

但是在碰到动态条件的 where 语句的时候,在 Java 代码里手搓 SQL 看着也很让人头大……这时候 MyBatis 提供的 dynamic SQL 就很好用了

但真的不喜欢 XML……

MyBatis-Plus 也了解过,但说不上来为什么,总是感觉不太喜欢这个库……

19989 次点击
所在节点    程序员
155 条回复
dobelee
2023-12-29 14:35:49 +08:00
@monkeyWie 大点的业务一般都不让连表和聚合。ORM 的优势正是动态条件,几十个条件拼接,完全不用考虑语法错误,SQL 拼接会死人的。
NoobNoob030
2023-12-29 14:38:01 +08:00
php 的 orm 用着比 java 的爽多了
zhengwenk
2023-12-29 14:38:32 +08:00
自己做的小项目喜欢直接 sql 。 其他 orm
Sigrdirfa
2023-12-29 14:45:24 +08:00
自己写喜欢写 SQL ,但是代码里看到同事的 SQL 就会想死....那还是大家一起用 ORM 吧。
gongquanlin
2023-12-29 14:45:47 +08:00
laravel 的 orm 会对一些联表之类的查询进行优化,比如批量的一对多的子查询,laravel 会先把所有 id 查出来,然后再根据 id 把所有的子数据查出来再聚合,基本上就是 n + 1 条请求就解决了;
但是 mybatis 即使映射了 association 和 id ,也是会循环查 id ,再循环查子数据

当时从 php 转 java 的时候发现,phper 如此牛逼和人性化,java 如此落后。奈何国内潮流是 Java

直到我发现了 nodejs ,哈哈~
deadlyn
2023-12-29 14:47:51 +08:00
@gam2046 Confluence 后端就是大量 ORM ,涉及各种表关联都必须精心维护好 Entity ,这类产品有一个特色是卖给不同的客户群体,可支持不同的 DB
sunmoon1983
2023-12-29 14:50:09 +08:00
vialon17
2023-12-29 14:53:59 +08:00
直接手搓 sql ,别人也能看得懂,
复杂的逻辑可以取完值后再做逻辑运算。
hongye
2023-12-29 14:55:14 +08:00
最近在做信创迁移,A 系统中存在大段手写的 MySQL 方言,B 系统基本上使用的都是 mybatis 框架实现的( SQL 标准兼容比较好)。两个系统的迁移成本估计为 5:1 ,因此从可维护性角度还是建议采用 ORM 框架
flmn
2023-12-29 15:10:16 +08:00
go 的 ent 谁用过,介绍介绍经验
gitrebase
2023-12-29 15:11:37 +08:00
@sunmoon1983 这🫥啥啊
jurassic2long
2023-12-29 15:16:05 +08:00
@sunmoon1983 以前接手过这种项目, 当时就想把写这种 SQL 的人拉出去砍了
bianhui
2023-12-29 15:16:26 +08:00
@hongye 那明显是 A 好啊。要是都得 A 至少有多四个人有活干,养活一家老小。你可能只是用一个简简单单的 orm 框架,未来有四个人因为你的这一举动而失业,换不起房贷,老婆和别人跑了,3 个还不是自己的,收手吧
lifei6671
2023-12-29 15:19:59 +08:00
@XCFOX 我用 gorm ,感觉挺好用的,生成的 SQL 基本上和手写 SQL 差不多。还有很多灵活的表达式写法。
CloveAndCurrant
2023-12-29 15:20:46 +08:00
@flmn 用过,还行,感觉比 gorm 好用,就是生成的 SQL 很垃圾,强制加 distinct ,不知道最新版改了没有
ntedshen
2023-12-29 15:28:17 +08:00
与其说 sql 好用不如说是 java/go 系的 orm 不够好用。。。
尝试写过 go 的 orm 。。。那时候泛型还没出,建个模型自己写都写的头大,背起来更是蛋疼,那可不是 sql 好用嘛。。。

可能弱类型对这块有先天优势?
至少 nodejs 和 php 的 orm 确实很好用,非要写一堆 join 和专有语法也可以自己 mod ,至于性能影响。。。拼个 sql 能有性能影响你就不该上弱类型。。。
Binwalker
2023-12-29 15:33:31 +08:00
目前我感觉没有 ORM 的体验能和 Rails 的 ActiveRecord 相媲美
yule111222
2023-12-29 15:36:22 +08:00
不存在真正的 ORM 框架,因为这里面的 M 通常是对应数据库表的 entity ,这种模型压根做不了业务
另外我用 kotlin 和 KTORM 还是挺爽的
XML 里写 sql 是最丑的
gitrebase
2023-12-29 15:38:18 +08:00
@lifei6671 我也喜欢用 GORM ,不可否认的是 GORM 确实很不优雅、很不 ORM ,但是感觉……他做到了便携性与灵活性的一个 balance……很怪,我个人也觉得 GORM 丑不垃圾的,但感觉真的很好用
coinbase
2023-12-29 15:39:26 +08:00

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

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

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

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

© 2021 V2EX