大家喜欢用 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 条回复
yidinghe
2023-12-29 17:07:40 +08:00
不要在意项目大小,小项目最终也会演化出大量的关联查询。对 SQL 本身的封装要好过 ORM 。
woodfizky
2023-12-29 17:08:31 +08:00
还真可以,其他 ORM 不熟不知道,python + SQLAlchemy 完全可以做到 join + sub_query + union_query + group_by + 动态传入 and 、or 条件,写熟悉了跟写原生 SQL 的思路是差不多的
yooomu
2023-12-29 17:14:50 +08:00
我工作写 java 的,日常用 mybatis plus ,像 JPA 那种 ORM 还是用不来,黑箱太多了,有种不安全感。还是根据场景来吧,简单的单表会用 mybatis plus 的 CRUD 接口,涉及联表还是手写 SQL 比较舒服,清晰明了,别人理解起来也容易。把联表拆成多个单表查询,然后用 mybatis plus 其实也可以,出现问题也方便调试,但是代码量太大了,写起来一大坨,别人也不好理解
Seulgi
2023-12-29 17:15:41 +08:00
表设计好,orm 当然效率更高。表设计差,当然 sql 更好写。
BuffDog
2023-12-29 17:15:41 +08:00
以前写 C#用 SqlSugar ,真的神中神,目前没见过能超越这个的 ORM
Linq 写 SQL ,爽的不行
chimission
2023-12-29 17:18:15 +08:00
这个问题和具体的语言关系还是蛮大的, 像 python 的 peewee ,orm 写起了思维方式和原生的 sql 基本一致,用的时候很少遇到需要手写 sql 的情况,但是写 GO 的时候就没这么顺滑了,还要把脑子里的 sql 转义成 orm 的语法才能写下来
memorycancel
2023-12-29 17:40:07 +08:00
用过 Ruby 的 ActiveRecord 后,你就会发现,在座的各位都是。。。
kakki
2023-12-29 17:57:12 +08:00
Rails +1 ,Java 和 Go ,属于语言限制了 ORM 的发挥,元编程能力越强,ORM 越强。
Corrots
2023-12-29 17:59:36 +08:00
Go 之前有个新项目用过 Gorm ,但是体验不是很好,遇到过几个小坑,官方的文档也很久没更新过了。
后面就只用 sql builder: Squirrel 或者直接写 SQL 了
huijiewei
2023-12-29 18:05:08 +08:00
以前喜歡寫存儲過程和 SQL

現在喜歡 ORM
illusory
2023-12-29 18:06:32 +08:00
静态语言的强大 ORM ,虽然它自称 Functional Relational Mapping (FRM)

https://scala-slick.org/doc/3.0.0/introduction.html
wenxueywx
2023-12-29 18:12:08 +08:00
什么方便用什么;
什么用的熟练用什么;
原生 sql 写起是非常爽,奈何处理业务逻辑有时候反而更麻烦。这时候就该 orm 上场了。
sheeta
2023-12-29 18:14:48 +08:00
建议写 Java 的都来看看 PHP 的 ORM ,哈哈哈 https://laravel.com/docs/10.x/queries
ktqFDx9m2Bvfq3y4
2023-12-29 18:19:59 +08:00
C#,EF Core 确实 NB ,但我现在倾向于使用轻量极 ORM 了:因为我在推独立服务。而且之前有次 EF Core 升级搞出很多问题,我觉得服务需要确定性所以在尽量减少 EF Core 的使用了。
akagishigeru
2023-12-29 18:29:36 +08:00
Eloquent ORM:在座的各位都是辣鸡
xuyang2
2023-12-29 18:31:17 +08:00
q447643445
2023-12-29 18:49:13 +08:00
一开始 只写 sql
后来 混用
现在 只用 orm
业务简单 已经很多个项目 不写 sql 了 太舒服了
mmmhhhddd
2023-12-29 19:18:35 +08:00
不考虑性能只追求方便 orm, 复杂查询和性能追求原生 sql
guotie
2023-12-29 19:40:17 +08:00
drizzle 的 orm 我觉得很好
fancy2020
2023-12-29 19:50:32 +08:00
ORM 封装太重,裸写 SQL 太麻烦坑也太多,最喜欢的是 knex.js 这种 SQL builder ,以及 objection.js

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

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

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

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

© 2021 V2EX