我司新项目小伙伴们用的 Mybatis,我之前没用过这个,初看他们写的代码和生成的sql,总觉得这玩意儿这么用有些不妥,特来请教下是他们用的方式有问题还是这玩意儿有什么别的黑魔法?
select *,这严重违反常见规约也严重影响性能吧?mapper xml给我的直观感受还不如格式化后的SQL易读,而且编码效率也不会更高吧? 1
shinelogo Dec 16, 2020 via iPhone
参照物是?
|
2
manami Dec 16, 2020
如果找个对比的话,个人觉得 MyBatis 没有 Spring Data JPA 好用。MyBatis 可以不用 xml 的,个人习惯使用 mybatis 注解的方式写 SQL,感觉也不错
|
3
brezp Dec 16, 2020
比较方便撸业务 , 业务不复杂(多表,多动态等等)看不出 mybatis 的优势,那你司之前不用 mybatis 都是用的什么呢? JDBC , JPA?
|
5
StopTheWorld Dec 16, 2020
[我看到很多用 mapper 生成的语句都是 select *] ,这是你小伙伴的问题,不是 mybatis 的问题。
|
6
xiangyuecn Dec 16, 2020
所以导致了 一堆蹩脚的 plus plus plus 存在(不用写 xml 居然能成为最大卖点😂)
|
7
SuperXRay Dec 16, 2020
select * 和 select 所有字段性能相差无几,说严重影响性能有看过性能对比么
当然我们有时候只需要部分字段,那可以不 select *,这和用不用 Mybatis 没什么关系 Jpa 一开始觉得简单,多表之后简直要命,还是 Mybatis 方便 |
8
ouxch OP @shinelogo 哈哈 O(∩_∩)O,是我没说清楚。
我并不是拿它跟其他 ORM 对比,当然严格说它也算不上 ORM,就是个 SQL 模板引擎吧。 所以就简单的跟手写 SQL+自己封装 DBUtils 来比吧。 既然这么多人用,应该是解决了某个痛点吧,但以我目前粗浅的认识来看,没有解决多大痛点不说还带来一系列新的问题。 其实主要就是我说的那两个问题,当然还有一些别的问题比如: 3. 编写 xml 既费时易读性又差,代码不像代码、配置不像配置,这种东西到底比 Java 拼接字符串高明在哪里? 4. 还有调试也是一个问题,不运行就不知道最终生成的 SQL 是什么样的。 |
9
ouxch OP @xiangyuecn 所以这并不是一个开箱即用的好方案,还得自己折腾是吧😄
|
10
shinelogo Dec 16, 2020 via iPhone
@ouxch 我多年没撸代码了,但是 mybatis 对比 hibernate 我还是更喜欢前者,这些框架的优势是弱化数据库之间的差异化,提高兼容性,未后期切换数据库减轻工作量,还有就是我记得 mybatis 有个框架可以根据你的数据库生成很多 增删改的通用语句(规则可以自定义),所以我认为这东西的存在意义是快速开发,把一些无趣的编码工作省略掉
|
11
opengps Dec 16, 2020
不要只看重技术性能,写原生 sql 当然省事高性能,在看看团队配合方面的优势,性能其实并不是重点了
|
12
Jooooooooo Dec 16, 2020
所以用别的就不会有 select * 的问题?
|
13
ouxch OP @SuperXRay
[select * 和 select 所有字段性能相差无几,说严重影响性能有看过性能对比么] 我当然不是这个意思啊,为什么会有这种理解😄,`select * `和`select 所有字段`能有什么区别。 读取不需要的列除了会影响执行计划是否走索引,还会增加 CPU 、IO 、NET 消耗。当然这都是另外的问题了。 我的疑问是查询部分字段的话,mybatis 的实现方式是自定义 mapper xml,这种反人类的设计无论从工作量还是易读性,好像都比不上手写 sql 。 |
14
Hurriance Dec 16, 2020
@ouxch xml 的确是易读性差了点,只是相对于 jpa 来讲,多表下 mybatis 的确更好写点,也可以搭配 mybatis-plus 来用,单表查询基本都可以不用写 xml
|
15
ouxch OP @Jooooooooo 求不抬杠😄。看下我 13 楼的回复🙏
|
16
Jooooooooo Dec 16, 2020
@ouxch 没看出 xml 可读性差在哪, 贴个代码对比一下?
|
17
Hurriance Dec 16, 2020
@Jooooooooo xml 可读性不差 spring 就不会推 yaml 了
|
18
ouxch OP @StopTheWorld 那`mybatis`除了写反人类的 xml,请教下还有其他优雅的方式来实现只查询部分字段吗。回头我去嘲讽他们哈哈😄
|
19
slyang5 Dec 16, 2020
月经帖 ?
|
20
securityCoding Dec 16, 2020
@SuperXRay
select * 和 select 所有字段性能相差无几 查全部字段是性能一样的,都要回表 .如果恰好是查索引字段性能差距还有点的 ,不需要回表直接使用覆盖索引或者索引下推机制了 ,大表高并发时会比较明显 |
22
Jooooooooo Dec 16, 2020
|
23
sagaxu Dec 16, 2020 via Android
@ouxch 有一种痛点,叫别人觉得你痛。mybatis 还没手拼 sql 方便,代码约束好 sql 在什么文件拼,编程语言的表达能力比 XML 强的多。
|
24
Oktfolio Dec 16, 2020
不要问我这是在做什么,有没有必要这样做,不是我干的,这里面还有动态查询。
https://sm.ms/image/JEPm2uXckIF9UhK |
25
zjsxwc Dec 16, 2020
都是为了拼 sql:
- Mybatis 用 xml 模板代码里面拼 sql,非常直观一目了然,一定程度上具有一定灵活性方便复用 - Jpa 用 Builder 模式 java 代码面向对象方式拼 sql,一定程度上直观一目了然,非常具有灵活性方便复用 类比 Vue 与 React 都是为了拼 html - Vue 用私有的 vue 模板代码里面拼 html,非常直观一目了然,一定程度上具有一定灵活性方便复用 - React 用 Builder 模式 javascript 代码面向对象方式拼 html,一定程度上直观一目了然,非常具有灵活性方便复用 比如 React 可以非常简单地做可见就可得的拖拽组件的方式生成运营活动页,而 Vue 很难,因为 vue 模板代码已经写死,不能在运行代码的时候动态修改 vue 模板代码,这类不够灵活复用的问题对于 Mybatis 也一样,xml 模板代码写死后也不能运行时动态修改,当然对于大部分后端项目来说没有前端对于灵活性要求大,甚至大部分前端项目也不需要 React 的灵活性。 |
26
liudaolunhuibl Dec 16, 2020
统计相关的需要复杂 sql 的用 mybaties,简单的 CRUD 的就用 jpa
|
27
hantsy Dec 16, 2020
mybatis 不如用 Spring JdbcTemplate 方便,如果我真的需要写 SQL 的话。
|
28
coderwl Dec 16, 2020
mybatis 在我看来要配和 mybatisHelper 等插件使用,在 xml 中写 SQL 的体验是拼接字符串不能比的,自动提示,字段纠错这些拼接功能都是必备的。如果没有插件,那还不如拼接 SQL
|
29
hantsy Dec 16, 2020
日经帖子,Hide
|
31
yalin Dec 16, 2020
菜刀而已
|
32
jitongxi Dec 16, 2020
mybatis plus,方法注解 sql 模板,爽歪歪。。。
5 个以上表关联查询, 试试 jpa ?试试就逝世。 |
33
ElmerZhang Dec 16, 2020
我们之前用 Mybatis 是为了直接用 xml 写 SQL,规定所有数据库语句都必须用 xml 来写,这样某个 SQL 出慢查询时方便定位到底是哪里用到的。
|
34
MIUIOS Dec 16, 2020
不要再去纠结 mybatis 和 jpa 了 不结合业务情况来讨论技术的完全是耍流氓
|
36
securityCoding Dec 16, 2020
@jitongxi jpa 多表条件查询确实难用 ,好在业务中规定只能单表查询 , 5 个表以上得去拜访下数据组大佬了
|
37
Jrue0011 Dec 16, 2020
Mybatis 适合比如需要动态 SQL 复用( include 、bind )、复杂结果映射( discriminator 、collection )之类的场景。
至于普通的动态 SQL 倒不算特别大优势,因为其他 ORM 框架也基本能做到。 之前因为某个需要稍微去了解了下 Camunda 、Activiti 工作流引擎,然后发现他们操作数据库也是用的 Mybatis,就去看了下他们是怎么用的,好家伙那里面各种标签用的飞起。 |
39
hangszhang Dec 17, 2020
日经贴, 天天讨论, 服了
|
40
beginor Dec 17, 2020 via Android
.Net 平台上基于 linq 的 ORM 兴起之后, 像 mybatis 这种半自动的就没落了, 当年 iBATIS.Net 也是能扛起半边天的。
Java 平台却一直没有出现好用的 linq 的 ORM 框架, 到底是什么原因呢? 期待 Java 平台上的基于 linq 的 ORM 框架, 看到时候还有谁说 mybatis 香! |
41
fpure Dec 17, 2020 via Android
表达能力。
我知道许多人喜欢 jpa 的类型安全,但是遇到复杂的查询用 jpa 写不出来的时候你就得抓狂 |
42
liuhuan475 Dec 17, 2020
@beginor jpa ? mp?
|
43
cco Dec 17, 2020
@SuperXRay 确实看到过这种文章,应该是 mysql 升级后做的一些优化,包括 in 之类的操作。
不过我个人没有去用大量的数据去验证,只不过目前看确实没啥影响。 |
44
jiao Dec 17, 2020
项目里但凡有一两个复杂 sql 的需求,jpa 就得去各种查文档,代码、sql 语句外加创建视图结合来实现功能。费很大劲实现的需求,对 mp 来说可能真就是一个 select 标签的事。
我不能说 mp 就比 jpa 强大,但有些反人类的 sql 出来了,用 mp 就有种无论什么 sql 我都不怕,不管你是几张表 join 、union 、group,对我来说就一个 select 标签。(也有可能是我 jpa 功夫不到位) |
45
liyhu Dec 17, 2020
日经贴, 爱用不用
|
46
hyqCrystal Dec 18, 2020
我想了解 楼主 之前用什么
|
47
chaleaochexist Mar 7, 2023
如果不考虑具体语言的话
易用性排名 django orm > peewee > sqlalchemy > sqlc > mybatis 但是 mybatis 确实是很流行我是醉醉的. |