关于 mybatis 的疑惑

2023-11-13 09:45:56 +08:00
 gomorebug

新手刚学 mybatis ,发现每次使用都要配一堆层,所以心中有个疑惑,为啥这么麻烦还是有一堆人用?是因为在实践中可以解决啥问题吗

6902 次点击
所在节点    Java
83 条回复
dawnflyc
2023-11-13 21:49:37 +08:00
@dawnflyc 手残分出好几个来,以上就是抛砖引玉了,https://github.com/dawnflyc/JqlApi
分为几个库,一个 api 库定义了语法之类的,然后如果用 mybatis 的话 需要一个 mybati 实现库,如果用 jdbc 的话,需要一个 jdbc 实现库,需要什么导入什么,只是封装而已,并没有写核心的东西,以为我水平也达不到。
Poluk
2023-11-13 22:19:35 +08:00
@dawnflyc #58 小哥,我想请教你一下。我前段时间跟着一个项目,基本没写什么联表。

比如说一个返回结果他要包括两张表的信息,但是在 sql 里讲师并没有去写连表查询,而是用一个包含了那两张表字段的类,作为 VO 封装类返回,然后在 Service 层里,通过一些方法去把那两个实体类对象的字段 set 到 VO 封装类里,最终返回。

我在想这样是不是也能去写 sql 的连表查询吧,因为在 Service 层里,针对这个查询功能写的逻辑比较多,有一点点繁琐。一般现实开发环境中,连表查询写的多?还是我描述的这种方法居多?或者根据业务需求决定的?
cnzjl
2023-11-13 22:34:09 +08:00
为什么不直接用 jdbcTemplate 呢
huigeer
2023-11-13 22:38:41 +08:00
java 这么强悍的面向对象语言,居然还要手搓 sql ,搞个舒服的 orm 不可以吗? 还是 laravel 的 orm 嗨皮
mosanHZ
2023-11-13 22:43:13 +08:00
@netabare jpa 默认你的数据库表设计符合 ddd ,然而现实是你维护的系统数据库表都是前面的人随意设计的
dawnflyc
2023-11-13 23:01:38 +08:00
@huigeer 我上面写的那个,就是感觉竟然没有一个好用的 orm ,所以自己照模照样搞了一个
dawnflyc
2023-11-13 23:05:32 +08:00
@Poluk 那如果又有一个接口 不需要那么多字段 因为会泄露信息吗 那又得新建一个 vo ,太麻烦了。一般联表挺多的呀。我之前那个项目 有小区、楼栋、单元、楼层、户,然后就是一长链,然后就需要挨个查,一长链联表,很折磨。我也是一个新手呀
Poluk
2023-11-13 23:47:45 +08:00
@dawnflyc #67 确实,那个项目因为有些查询不需要那么完整的字段,然后又担心泄露,确实建了几个 VO ,搞得还挺麻烦的。
PlsDontStop
2023-11-14 00:11:37 +08:00
事实上除了国内也没人用这玩意
Znemo
2023-11-14 00:32:47 +08:00
技术上没有什么东西能同时满足解决复杂的问题并保持简洁,如果有,那只能说明问题不够复杂。就像 JPA/Hibernate 或者 Spring Framework ,了解的多才有信心写得少。
aristotll
2023-11-14 01:01:12 +08:00
jooq 其实也不错 逃
ysw
2023-11-14 01:05:16 +08:00
@looo 我也是这样
ysw
2023-11-14 01:19:03 +08:00
@aristotll 发现 Java 和数据库相关的怎么那么多都是有收费选项的,flyway 和 liquibase 也是这样的,redisson 也是
gongquanlin
2023-11-14 09:08:51 +08:00
楼上都说为啥明明一个 List<Map<K,V>>就能解决的问题非要建一堆 vo 、bo ?
说明接手的二开和维护的项目少,看看一堆不按开发规范的 SB 写的代码,返回直接用 map.put 搞,简单的业务逻辑还好,复杂的业务逻辑得从这个函数甚至其他类、函数开始看,一点点的捋才知道这个 map 有哪些字段;调试的时候挂了还好,生产一挂,日志没有,纯靠瞎猜

有了 vo 、bo 、dto 之后,debug 只需要看下对应的 pojo 就知道这个函数返回啥了,就算注释少,只要按着开发规范基本上都能看到个七七八八,心智负担大大降低。以前我也觉着写这 b 玩意麻烦,但是现在这么多 json 转 bean 工具,最多多几十秒的工作量,维护起来真的是香的不行
looo
2023-11-14 09:33:21 +08:00
@gongquanlin 赞同,写 Map/JSON/BeanUtils.copy/动不动就自己造轮子,感觉大部分都是被外包带坏了,这种项目如果后面加功能/维护,那会就想日个🐎了
zoharSoul
2023-11-14 10:12:36 +08:00
就一层啊 哪有一堆层
bill110100
2023-11-14 14:01:21 +08:00
@Aresxue mybatis 怎么不叫 orm ?
bill110100
2023-11-14 14:07:19 +08:00
@dawnflyc 不建 vo ,光用 map ,你怎么知道 map 里有哪些数据?今天你能记得,一年后呢?更不用说其他引用的人,一个 map 传数据,他怎么知道你 map 里有什么?
Aresxue
2023-11-14 14:33:40 +08:00
@bill110100 orm 的全称是 Object/Relational Mapping ,比较典型的特征就是你只管操作对象框架会帮你把对象的变更映射到数据库,mybatis 本身只是存放 sql 不存在有时候连表对应的对象可能都不会存在,mybatis plus 才是 orm ,而如果要说到更纯正的 orm 还要用到 Active Record 模式,像 python 中的 SQLAlchemy 、c#的 Entity Framework 都是比较纯正的 orm 。
Jrue0011
2023-11-14 14:38:59 +08:00
国内 Mybatis 可能是培训机构、视频啥的带起来的。哪里有统计数据可以表示在国外没人用 Mybatis 。StackOverFlow 发帖数量感觉只能表示开发人员对 JPA 的疑惑更多。Github 的 issue 数量?

Mybatis 框架是国外的人开发的,SpringBoot 虽然没有专门指定 Mybatis 的版本,不过 start.spring.io 创建项目时可以选择 Spring 推荐的 Mybatis 版本。另外还有一个区别于 Spring Data JPA 复杂概念而开发的简化版本 Spring Data JDBC 项目,它的文档里也有描述怎么与 Mybatis 集成,感觉应该不至于国外完全没人用吧。

说起来如果有人不喜欢 Mybatis Plus 更喜欢 Spring Data JPA 那种风格,又想要 Mybatis 灵活 SQL 的可以试试 Spring Data JDBC ,可以说是 Spring 官方的 Mybatis Plus 了。

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

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

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

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

© 2021 V2EX