Mybatis 到底是或不是 ORM?为什么?

2023-11-23 06:16:26 +08:00
 mangojiji
我觉得它是,因为它确实可以将对象保存到数据库也可以从数据库里检索到对象,
但隐约感觉哪里好像又有点不对劲。。

它和 hibernate 以及 ebean 之流的框架到底谁是 ORM ,如它不是 ORM ,那么究竟是缺失了什么特征呢?
3728 次点击
所在节点    数据库
35 条回复
ChoateYao
2023-11-23 08:52:39 +08:00
不是,人家就是 Object Mapper ,缺少关系连接和业务逻辑实现。
Goooooos
2023-11-23 08:53:54 +08:00
你理解的 ORM 是啥?
Masoud2023
2023-11-23 09:27:18 +08:00
按我的理解能手写 sql 的都不叫 ORM ,ORM 应该是 SQLAlchemy 那种直接能拿模型生成 SQL 的
wanguorui123
2023-11-23 09:38:56 +08:00
1 、思想:
mybatis 面向过程开发

JPA ( Hibernate )面向对象开发

2 、侧重点:
mybatis 采用 XML 管理 SQL 比较直观,查询多的场景比较自由灵活、缺点存一些符号冲突(<>),管理思想还是面向过程,需要通过 Plus 加强对象管理

JPA 将数据库完全映射为对象需要有业务的整体设计能力,JPA 优势是简单的 CURD 根本不写 SQL ,JPA 缺点就是需要了解数据状态同步管理,复杂的业务尤其需要了解实体各个阶段状态,以及复杂的连表查询需要调用 JPA 的原生查询接口或者 DSL

3 、抽象能力
mybatis 使用原生的 SQL 方言,迁移能力比较差

JPA 使用 HQL 屏蔽了底层方言差异抽象的比较彻底,迁移能力比较强
weijancc
2023-11-23 09:55:49 +08:00
这个问题被讨论烂了都, 明明百度就有一堆答案
kevinlia0
2023-11-23 10:15:27 +08:00
By chatgpt

MyBatis 是一种持久层框架,通常被称为数据映射框架( Data Mapping Framework ),而不是严格意义上的对象关系映射( ORM )框架。尽管它与 Hibernate 等 ORM 框架有一些相似之处,但它们之间存在一些关键的区别。

1. **SQL 控制:** MyBatis 更注重对 SQL 的控制,它允许开发者编写和优化原生 SQL 查询,而不是完全依赖于框架生成的 SQL 。这使得开发者可以更细粒度地控制数据库访问,针对复杂的查询进行优化。

2. **映射方式:** 在 MyBatis 中,对象和数据库表之间的映射是通过 XML 或注解进行配置的,而不是像 Hibernate 那样完全基于对象的映射。这意味着在 MyBatis 中,你需要显式地指定如何将对象属性映射到数据库列,而在 ORM 框架中,这一切通常是自动完成的。

3. **对象状态:** 在 ORM 框架中,对象通常处于持久化状态,而在 MyBatis 中,对象通常是短暂的,它们只在执行 SQL 语句时与数据库进行交互。这使得 MyBatis 更加适用于需要精细控制数据库访问的场景。

总的来说,尽管 MyBatis 可以执行对象到数据库表的映射和数据库查询结果到对象的映射,但它更强调 SQL 的控制和灵活性,相较于 Hibernate 等严格的 ORM 框架而言更接近数据映射框架。因此,如果你更喜欢自己编写和优化 SQL 语句,或者需要处理复杂的数据库操作,MyBatis 可能是一个更好的选择。如果你更倾向于对象的自动映射和更高级的持久化管理,那么 Hibernate 等 ORM 框架可能更适合你。
iceloop
2023-11-23 10:56:10 +08:00
ORM 框架的核心是自动化地将对象模型映射到关系型数据库,Mybatis 一个垃圾的 SQL 映射框架,无论怎么说都够不上 ORM ,中国特色开发主义才让 Mybatis 在中国有地位,早应该被时代洪流淘汰的垃圾产物
burymme11
2023-11-23 11:05:12 +08:00
我一点都不觉的 mybatis 垃圾,复杂的 sql 处理直接写在 xml 里,直观明了,排错调试很方便。
使用 ORM 框架还能用出优越感?这玩意还能搞出鄙视链? WFT ??
Mandelo
2023-11-23 11:09:29 +08:00
半 ORM
totoro52
2023-11-23 11:31:40 +08:00
@burymme11 mybaits-plus 无敌 JPA 业务逻辑复杂点的时候代码那是给人看的吗 那个 SQL 跟牛皮癣一样贴在上面一大坨 受不了受不了
totoro52
2023-11-23 11:32:17 +08:00
@totoro52 但是业务简单的肯定首选 JPA
XCFOX
2023-11-23 12:04:17 +08:00
跟 C# 的 EF Core 比,MyBatis 最多算一个 SQL Builder 。
好的 ORM 应该尽可能减少 SQL 的书写,尽量自动化,尽量贴近语言原生语法。
看过 C# 的 Entity Framework 、Ruby 的 Active Record 、php 的 Eloquent 、Typescript 的 MikroORM 、kotlin 的 Ktorm
才知道什么是好用的 ORM 。相比之下 Java 、go 生态下缺少好用的 ORM 框架。

优雅的 ORM (EF Core)是这么更新的:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Single(b => b.Url == "http://example.com");
blog.Url = "http://example.com/blog";
context.SaveChanges();
}
使用 C# LINQ 表达式写查询,直接修改 blog.URL 的值再保存修改,真正的面向对象、真正的自动化,开发人员甚至不需要深入了解 SQL ,极大减轻了开发时的负担;

GORM 是这么更新的:
db.Model(Blog{}).Where("Url = ?", "http://example.com").Updates(Blog{Url: "http://example.com/blog"})
在 gorm 自身的语法 "db.Model().Where().Updates()"之中混入半句 sql "url = ? ",这就要求开发人员既要会 sql 也要熟悉 gorm 额外的语句,开发时的性质负担并没有减少;
kidlj
2023-11-23 12:09:14 +08:00
@XCFOX 了解下 Go 的 ent 先?
XCFOX
2023-11-23 12:33:16 +08:00
@kidlj #13
ent 是这么更新的:
n, err := client.Blog.
Update().
Where(
blog.Url("http://example.com"),
).
SetUrl("http://example.com/blog").
SetTitle("The Last Theorem").
SetAuthor("Clarke").
Save(ctx)

ent 比 gorm 要严谨得多,而代价则是啰嗦的指令式调用,极大损失了灵活性。

与 ent 相比,同样使用代码生成的 node.js 的 prisma 是这么更新的:
const bolg = await prisma.blog.update({
where: {
url: "viola@prisma.io",
},
data: {
url: "Viola the Magnificent",
title: "The Last Theorem",
author: "Clarke",
},
});
prisma 将查询参数和更新数据全都赛进 update() 中,更容易实现动态参数。
gitrebase
2023-11-23 12:43:30 +08:00
#6 GPT 说的没错,MyBatis 纯纯的 Data Mapping ,跟 Object Relation Mapping 扯不上一点关系

MyBatis 跟 Go 生态里的 sqlx 、squirrel 这种 SQL builder 是差不多的

BTW ,Java 和 Go 里感觉没有一个 ORM 用起来是真的舒服的,他们对“网上说的‘复杂的场景’”都比较乏力,因此个人认为在 SQL 没有特别复杂的情况下(感觉没有太多表的 Join 就不算太复杂)直接用 JPA 、GORM 之类的完全没问题(绝大多数项目都到不了这程度)
tunzao
2023-11-23 12:44:19 +08:00
是不是,又有什么关系呢?
nothingistrue
2023-11-23 13:57:13 +08:00
@XCFOX #10 你所举例的代码中,EF Core 才是 ORM ,因为它的操作方法上完全看不出 SQL 的影子。GORM 还有后面的 ent 并不是 ORM ,因为它们的 Where()、Update()、SetXXX() 等方法,只不过是 SQL 的翻版,他们的数据模型基础还是关系模型。

ORM 的全称是 Object Relational Mapping ,是对象数据模型跟关系数据模型之间的映射,它的重点是让你不必跳出面向对象开发的思路,就能使用关系数据库作为数据持久层。并不是简简单单的隐藏 SQL 。
cheng6563
2023-11-23 14:11:20 +08:00
严格的 ORM 不会让你碰到 SQL 。
并且静态语言上的 ORM 框架还应当具备语法检查,这点就 C#做的比较好,Java 的 Jinq 只能凑合用。其他的 ORM 框架或多或少都还是要涉及手动拼接 SQL

MyBatis 对数据库所有操作都要自己写 SQL ,他只是提供了个对 JDBC 优化的模板引擎,算不上 ORM
另外,直接在程序里嵌 SQL 的都是大便框架,尤其是那些自创 DSL 来隐藏 SQL 细节的框架
gitrebase
2023-11-23 14:17:31 +08:00
@cheng6563 #18 哈哈哈哈最近刚看到有个 typescript 到 orm 框架说自己是 modern ORM ,但一看 README 它自己定义了一个 DSL 后我就直接懒得看了
lolizeppelin
2023-11-23 14:38:42 +08:00
@XCFOX
ent 已经够好了起码可以定义简单的连表关系了

静态语言没法做那么灵活的

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

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

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

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

© 2021 V2EX