大家喜欢用 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 也了解过,但说不上来为什么,总是感觉不太喜欢这个库……

23385 次点击
所在节点    程序员
155 条回复
james122333
2023-12-29 20:59:12 +08:00
当然允许的情况是 sql 除了 xml 等外部设定当语言用的除外 除非用...
用 sql 就像在下命令传参 直觉且少 orm 需要注意的细节
orm 少个设定就找个半天了 除非这个 orm 够轻量没有一堆不必要的功能 即便如此 orm 短处就在那 动态 sql 语句就搞死人了 你也无法兼顾动态和直觉
这篇感觉想钓鱼
james122333
2023-12-29 21:05:30 +08:00
至于某些框架提供拼接 sql 语法的函数恰恰证明不是纯 orm
题外话 laravel 还是快拿掉优雅这标签吧 不费什么资源力气才叫优雅 重的东西就不要叫优雅了
netabare
2023-12-29 21:07:06 +08:00
ORM 能在出现例如 n+1 等常见问题的时候报错编译失败,直接写 sql 就没有这层检查了。
zhuangzhuang1988
2023-12-29 21:15:48 +08:00
肯定看情况啊,
有不是非 A 即 B
Immortal
2023-12-29 21:19:02 +08:00
要不试试 sqlc
msg7086
2023-12-29 21:25:00 +08:00
ORM 也可以做多表联合查询,甚至可以根据具体情况做统一优化。
比如有些 MySQL 的子查询性能有问题,ORM 可以改写成先查询出 ID 然后再用 IN(ID)另外做一次查询。
再有比如说 MySQL 的大数 LIMIT 有性能问题,ORM 可以改写成先通过索引查出结果,然后再用 IN(ID)返回实际数据。

你当然可以全手动优化,一个一个查询找出来再一个一个改。但我可以抽象成一个插件,插进 ORM 里整个系统就全改好了。

上面这个 LIMIT 性能问题我之前自己的系统里刚遇到过。我自己做的一个 BT 站,几十万条记录,翻页翻得卡死。后来找到个 fast_page ,往 ORM 上加上,马上系统性能就上去了。我就加了这么一句:
posts = posts.fast_page if params[:page].to_i > 50
谁愿意写 SQL 谁去写,反正我懒。
shijingshijing
2023-12-29 21:27:06 +08:00
有了 ChatGPT ,再难的 SQL 也能写。
james122333
2023-12-29 21:27:45 +08:00
@netabare

这不是应该偷懒以及省资源就会主动想到解法的吗...
TuringHero
2023-12-29 21:39:01 +08:00
一直习惯 JPA + Query DSL ,动态条件判断了用 Query DSL 拼就行
james122333
2023-12-29 21:42:49 +08:00
@msg7086

这与是否为 orm 无关吧 修改优化 sql 语句那是额外功能
msg7086
2023-12-29 21:44:39 +08:00
@james122333 抽象就是 ORM 的优势之一啊。抽象了以后就可以在更高维度进行优化了。
zeroday
2023-12-29 21:48:43 +08:00
常用 sql 都是自动生成的
james122333
2023-12-29 21:50:45 +08:00
@msg7086

那只是 parser 不同...
bocchi1amos
2023-12-29 21:58:38 +08:00
感觉 orm 有点笨重,有时真不如我直接写 sql 。。
james122333
2023-12-29 21:59:23 +08:00
joyhub2140
2023-12-29 22:01:26 +08:00
有一说一,这个 JdbcClient 还真挺好用,特别是 IDEA 支持在 Java 代码里对 SQL 语句进行智能提示和高亮。

数据库字段有变更,刷新一下连接,Java 代码里的 SQL 的 field 字段还支持变红警告。

基本上可以抛弃 XML 写 SQL 了。
rustz992
2023-12-29 22:59:09 +08:00
不错我也是这个想法,别人的 sql 语句 有时候一看起来就感觉后面没法维护
EscYezi
2023-12-30 00:06:54 +08:00
工作中 java 用 mybatis plus ,算是 orm 和 sql 混用,尽量用 mybatisplus 单表查询,不在 xml 里写 sql.但奈何总会有联表查询查询的业务。
其实我更喜欢 jooq 那种,根据表结构生成 sqlbuilder ,然后用代码来写 type safe 的 sql
sngxx
2023-12-30 00:19:58 +08:00
写 sql 要把查出来的东西转成对象,一个一个字段搞能把人累死,还容易出 bug 。写工程重要的是实现,效率和稳定
ipangpang
2023-12-30 02:07:09 +08:00
可以类比成 喜欢汇编还是喜欢 c 语言

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

https://ex.noerr.eu.org/t/1004383

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

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

© 2021 V2EX