Mybatis 到底好在哪?国内大厂也在用?

2020-12-16 15:23:53 +08:00
 ouxch

我司新项目小伙伴们用的 Mybatis,我之前没用过这个,初看他们写的代码和生成的sql,总觉得这玩意儿这么用有些不妥,特来请教下是他们用的方式有问题还是这玩意儿有什么别的黑魔法?

  1. 我看到很多用 mapper 生成的语句都是select *,这严重违反常见规约也严重影响性能吧?
  2. 自定义的mapper xml给我的直观感受还不如格式化后的SQL易读,而且编码效率也不会更高吧?
6162 次点击
所在节点    Java
47 条回复
shinelogo
2020-12-16 15:29:37 +08:00
参照物是?
manami
2020-12-16 15:33:25 +08:00
如果找个对比的话,个人觉得 MyBatis 没有 Spring Data JPA 好用。MyBatis 可以不用 xml 的,个人习惯使用 mybatis 注解的方式写 SQL,感觉也不错
brezp
2020-12-16 15:36:17 +08:00
比较方便撸业务 , 业务不复杂(多表,多动态等等)看不出 mybatis 的优势,那你司之前不用 mybatis 都是用的什么呢? JDBC , JPA?
brezp
2020-12-16 15:37:09 +08:00
@manami JPA 撸动态 sql 感觉没有 mybatis 好用
StopTheWorld
2020-12-16 15:38:13 +08:00
[我看到很多用 mapper 生成的语句都是 select *] ,这是你小伙伴的问题,不是 mybatis 的问题。
xiangyuecn
2020-12-16 15:43:05 +08:00
所以导致了 一堆蹩脚的 plus plus plus 存在(不用写 xml 居然能成为最大卖点😂)
SuperXRay
2020-12-16 15:44:33 +08:00
select * 和 select 所有字段性能相差无几,说严重影响性能有看过性能对比么
当然我们有时候只需要部分字段,那可以不 select *,这和用不用 Mybatis 没什么关系

Jpa 一开始觉得简单,多表之后简直要命,还是 Mybatis 方便
ouxch
2020-12-16 15:48:28 +08:00
@shinelogo 哈哈 O(∩_∩)O,是我没说清楚。
我并不是拿它跟其他 ORM 对比,当然严格说它也算不上 ORM,就是个 SQL 模板引擎吧。
所以就简单的跟手写 SQL+自己封装 DBUtils 来比吧。
既然这么多人用,应该是解决了某个痛点吧,但以我目前粗浅的认识来看,没有解决多大痛点不说还带来一系列新的问题。

其实主要就是我说的那两个问题,当然还有一些别的问题比如:
3. 编写 xml 既费时易读性又差,代码不像代码、配置不像配置,这种东西到底比 Java 拼接字符串高明在哪里?
4. 还有调试也是一个问题,不运行就不知道最终生成的 SQL 是什么样的。
ouxch
2020-12-16 15:50:50 +08:00
@xiangyuecn 所以这并不是一个开箱即用的好方案,还得自己折腾是吧😄
shinelogo
2020-12-16 15:55:49 +08:00
@ouxch 我多年没撸代码了,但是 mybatis 对比 hibernate 我还是更喜欢前者,这些框架的优势是弱化数据库之间的差异化,提高兼容性,未后期切换数据库减轻工作量,还有就是我记得 mybatis 有个框架可以根据你的数据库生成很多 增删改的通用语句(规则可以自定义),所以我认为这东西的存在意义是快速开发,把一些无趣的编码工作省略掉
opengps
2020-12-16 15:56:57 +08:00
不要只看重技术性能,写原生 sql 当然省事高性能,在看看团队配合方面的优势,性能其实并不是重点了
Jooooooooo
2020-12-16 15:56:59 +08:00
所以用别的就不会有 select * 的问题?
ouxch
2020-12-16 15:58:26 +08:00
@SuperXRay
[select * 和 select 所有字段性能相差无几,说严重影响性能有看过性能对比么]
我当然不是这个意思啊,为什么会有这种理解😄,`select * `和`select 所有字段`能有什么区别。

读取不需要的列除了会影响执行计划是否走索引,还会增加 CPU 、IO 、NET 消耗。当然这都是另外的问题了。

我的疑问是查询部分字段的话,mybatis 的实现方式是自定义 mapper xml,这种反人类的设计无论从工作量还是易读性,好像都比不上手写 sql 。
Hurriance
2020-12-16 15:59:50 +08:00
@ouxch xml 的确是易读性差了点,只是相对于 jpa 来讲,多表下 mybatis 的确更好写点,也可以搭配 mybatis-plus 来用,单表查询基本都可以不用写 xml
ouxch
2020-12-16 16:00:02 +08:00
@Jooooooooo 求不抬杠😄。看下我 13 楼的回复🙏
Jooooooooo
2020-12-16 16:01:12 +08:00
@ouxch 没看出 xml 可读性差在哪, 贴个代码对比一下?
Hurriance
2020-12-16 16:02:16 +08:00
@Jooooooooo xml 可读性不差 spring 就不会推 yaml 了
ouxch
2020-12-16 16:02:44 +08:00
@StopTheWorld 那`mybatis`除了写反人类的 xml,请教下还有其他优雅的方式来实现只查询部分字段吗。回头我去嘲讽他们哈哈😄
slyang5
2020-12-16 16:04:51 +08:00
月经帖 ?
securityCoding
2020-12-16 16:08:23 +08:00
@SuperXRay
select * 和 select 所有字段性能相差无几

查全部字段是性能一样的,都要回表 .如果恰好是查索引字段性能差距还有点的 ,不需要回表直接使用覆盖索引或者索引下推机制了 ,大表高并发时会比较明显

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

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

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

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

© 2021 V2EX