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

169 天前
 mangojiji
我觉得它是,因为它确实可以将对象保存到数据库也可以从数据库里检索到对象,
但隐约感觉哪里好像又有点不对劲。。

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

JPA ( Hibernate )面向对象开发

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

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

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

JPA 使用 HQL 屏蔽了底层方言差异抽象的比较彻底,迁移能力比较强
weijancc
168 天前
这个问题被讨论烂了都, 明明百度就有一堆答案
kevinlia0
168 天前
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
168 天前
ORM 框架的核心是自动化地将对象模型映射到关系型数据库,Mybatis 一个垃圾的 SQL 映射框架,无论怎么说都够不上 ORM ,中国特色开发主义才让 Mybatis 在中国有地位,早应该被时代洪流淘汰的垃圾产物
burymme11
168 天前
我一点都不觉的 mybatis 垃圾,复杂的 sql 处理直接写在 xml 里,直观明了,排错调试很方便。
使用 ORM 框架还能用出优越感?这玩意还能搞出鄙视链? WFT ??
Mandelo
168 天前
半 ORM
totoro52
168 天前
@burymme11 mybaits-plus 无敌 JPA 业务逻辑复杂点的时候代码那是给人看的吗 那个 SQL 跟牛皮癣一样贴在上面一大坨 受不了受不了
totoro52
168 天前
@totoro52 但是业务简单的肯定首选 JPA
XCFOX
168 天前
跟 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
168 天前
@XCFOX 了解下 Go 的 ent 先?
XCFOX
168 天前
@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
168 天前
#6 GPT 说的没错,MyBatis 纯纯的 Data Mapping ,跟 Object Relation Mapping 扯不上一点关系

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

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

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

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

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

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

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

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

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

© 2021 V2EX