新手刚学 mybatis ,发现每次使用都要配一堆层,所以心中有个疑惑,为啥这么麻烦还是有一堆人用?是因为在实践中可以解决啥问题吗
1
Navee 2023-11-13 09:51:08 +08:00 2
门槛低:
只要你 sql 写得好,mybatis 用起来就不会有太大问题;但是你 sql 写得好 jpa 也不一定玩得转 对数据库设计要求低: 想怎么设计就怎么设计,只要你的 sql 写得出来,而且工作量不会增加太多; jpa 就得按照规范设计,不按照规范就会陡增工作量 |
2
netabare 2023-11-13 09:52:11 +08:00 via iPhone 2
我也不懂为什么这玩意这么多人用,国外的 JPA 和 Hibernate 感觉用起来舒服多了,虽然细节坑不少但多查查文档翻一下社区也能弄出七七八八来,而且兼容性更好。
|
3
ForkNMB 2023-11-13 09:54:55 +08:00
那为什么不用 mybatis-plus 呢
|
4
justplaymore 2023-11-13 09:56:15 +08:00
为了避免配置繁杂问题,用起来更方便,所以有了 mybatis-plus 。
|
5
murmur 2023-11-13 09:59:43 +08:00
你可以把 service 层省掉,就留一个 controller
|
6
murmur 2023-11-13 10:00:39 +08:00
@netabare 现在的低代码框架可以直接生成 CURD 包括多表带条件代码,生成不了的肯定比这个复杂,一般都是报表或者树啊嵌套查询这类的,都是得手写 sql 的,手写 sql 还是 mybatis 用着舒服
|
7
gejun123456 2023-11-13 10:06:52 +08:00
业务简单直接 controller 调用 mapper 就行,有各种代码生成器,使用中坑少学起来快,很快就能上手干活
|
8
xslong 2023-11-13 10:09:52 +08:00
直接用 mybatis-plus 舒服很多;
再用 Hibernate 完成同样的功能(特别是关联表)就会更明白他们的差异,Hibernate 并不是所有人都可以玩得溜; |
9
looo 2023-11-13 10:15:51 +08:00 1
JPA+QueryDSL
|
10
28Sv0ngQfIE7Yloe 2023-11-13 10:17:04 +08:00
JPA 需要符合规范的设计,但是业务中你很难从头设计库表,很多情况下是接烂摊子
|
11
xkxwd 2023-11-13 10:17:16 +08:00
你把其他 orm 框架都用一遍,再选觉得顺手的就行,每个人体质都不一样,不一定用的多的就适合你。
当然公司里团队协作需要技术栈统一除外 |
12
yosoroAida 2023-11-13 10:17:54 +08:00
直接用 mybatis-plus 会舒服很多,单纯用 mybatis 就要写很多繁杂的东西
|
13
zhazi 2023-11-13 10:19:52 +08:00 1
你说的分层是软件架构设计,跟用什么工具没关系,跟什么语言也没关系。
层是分离职责和管理依赖关系的方式。 每个层都有特定的责任。 较高层可使用较低层中的服务,反之则不行。 传统的三层应用程序有表示层、中间层和数据库层。 中间层是可选的。 更复杂的应用程序可以多于三层。 |
14
NizumaEiji 2023-11-13 10:21:30 +08:00 3
一堆层是指啥啊 这个和 mybatis 关系也不大把
|
15
weijancc 2023-11-13 10:26:01 +08:00
@murmur service 层是有必要的, 去掉后就变成业务代码在 controller 了, 代码贼脏, service 层直接写实现类不要弄个接口就好了.
|
16
Goooooos 2023-11-13 10:28:40 +08:00
简单项目我都用 jdbctemplate
|
17
lsk569937453 2023-11-13 10:35:48 +08:00
@netabare hibernate 的问题在于 sql 一复杂就嗝屁了。
|
18
GoflyYang 2023-11-13 10:39:17 +08:00
我觉得配置也没有多复杂,特别是配合 Springboot 配置也没有那么复杂,最主要是可以自定义 sql
|
19
winnie414 2023-11-13 10:39:58 +08:00
单论 mybatis 我觉得不好用 mybatis-plus 也是
|
20
angryfish 2023-11-13 10:41:32 +08:00
@weijancc service 不是必要的,看业务复杂度。1.去掉 service 接口,直接用 service 类 2.大多数接口在 controller 写了,因为逻辑并不复杂,只有遇到逻辑很多的才在 service 写。所以 service 的代码其实很少也很好看。
|
21
m0unta1n886 2023-11-13 10:58:14 +08:00
新手认为所有逻辑都写在 sql 语句里,然后调 sql 就行了是吧?,没 serviceimpl 做逻辑调用回滚啥的,光跑 sql,头轻脚重,该多看看开源项目
|
22
Leviathann 2023-11-13 11:02:35 +08:00
感觉不如 nextjs react component 里调 sql
|
23
cslive 2023-11-13 11:03:04 +08:00
|
24
Aresxue 2023-11-13 11:12:41 +08:00
配置一堆层是指 mapper 、dao?
纯用 mybatis 的人不多了,现在基本上都是用 mybatis plus ,单表增删改查用 baseMapper 复杂的才会用 xml ,这玩意你就理解成是个专门存放 sql 的地方,古早时期 sql 都是混在 java 代码里面的,后来发现维护太麻烦了(比较重要的原因是当时没有多行字符串这个语法糖)就想把 sql 和代码区分开,mybatis 选取了当时流行的 xml 格式使用 ognl 作为动态能力的补充,确实解决了代码和 sql 分离这件事情,只是到了现在 xml 人人喊打,ognl 表达式也略显笨重所以质疑声此起彼伏,但叫归叫其它能取代它且稳定好用的框架暂时还没出现。 歪楼:mybatis 不是 orm ,java 的 orm 月经帖太多了,目前的几款 orm 如 mybatis plus 、jpa 、hibernate 都有各自的问题,我对此比较悲观除非有 C#那种强大的语法糖,一款非常好用且完备的 orm 在 java 里可能很难诞生了 |
25
weijancc 2023-11-13 11:17:37 +08:00
@angryfish 那就是我说的, controller 一堆业务逻辑, service 层是变好看了, 但 controller 层变得丑陋不堪, 每次看到这种代码都让我严重怀疑开发人员的水平.
|
26
Bingchunmoli 2023-11-13 11:27:37 +08:00 via Android
@cslive 黑盒子不利于后续接手维护,虽然烂摊子真的很烂
|
27
msaionyc 2023-11-13 11:33:55 +08:00
干脆直接给个接口,前端直接传 SQL 查数据库
|
28
summerLast 2023-11-13 11:47:54 +08:00 1
数据库建模,上手简单,会写 sql 就能用,没有太多魔法
额,为啥不用 jdbcTemplate 呢,,, |
29
RedBeanIce 2023-11-13 11:56:09 +08:00
估计很多人没玩过 ddd ,,,加油吧
|
30
RedBeanIce 2023-11-13 11:56:33 +08:00
@RedBeanIce 另外,很多人估计没写过复杂的业务。
|
31
chaleaochexist 2023-11-13 12:58:14 +08:00
楼主是不是从别的语言转过来的?
还是 java 是你的第一门语言? |
32
SoviaPhilo 2023-11-13 13:01:00 +08:00
如果说手写 SQL 舒服的话, 哪个不支持 native Query
裸写 SQL 根本就不能算 mybatis 的优势 mybatis 用的人多完全就是因为阿里系在用这个,然后带起来的 目前我这里的感受是: 数据访问层一般情况下只负责最基本的 CRUD , 业务行为放在领域中, 这样这个项目才有可能控制得住 一旦让写了两三年的小兄弟放飞自我,什么牛鬼蛇神都写得出来 |
33
dayeye2006199 2023-11-13 13:22:09 +08:00
感觉这玩意儿根本不是 ORM
|
34
ionfev 2023-11-13 13:35:35 +08:00 1
MyBatis 和 MyBatis-Plus 的缺点
借用别人的观点:dao 层和 sevice 层交叉混用。 比如一个用户查询,用 UserMpper 查询也行,用 UserService 查询也行,想用哪个用哪个。 ----对比 JPA---- MyBatis 允许开发人员自定义 SQL 语句,适应特定的业务需求。 JPA 更倾向于使用命名查询和基于方法名称的查询,可能在某些情况下不如自定义 SQL 灵活。 JPA 不鼓励写手动写 SQL 语句,鼓励要用 JPQL 。使用原生 SQL 时可能会失去一些 JPA 提供的跨数据库的抽象和便捷性。 对于开发时表结构改来改去的时候,手写 SQL 方便。 当业务逻辑复杂,使用 JPA 生成的 SQL 也复杂到让人看不懂的时候,手写 SQL 直观灵活方便调试。 |
35
Masoud2023 2023-11-13 13:42:03 +08:00 1
web 应用分多少层取决于你应用体量,如果你业务共通逻辑很少,完全可以 controller 直接操作 mapper ,那帮喜欢 Java 胡乱分层,Service 里只有一句话的,基本你让他回答为什么分层,他都只会回答一句为了规范,实际屁都不是。事实上做 Service 层的目的其实仅仅是为了代码复用抽共通逻辑或者为了好写 aspect ,分层的时候一定要想清楚这一点,不要为了分层而分层。
|
36
ZeroDu 2023-11-13 13:44:18 +08:00
@cslive #23 你这是动态语言写多了吧。实际业务要是参数或者返回值搞这种 map jsonobject 之类,估计直接开骂了
|
37
summerLast 2023-11-13 13:52:51 +08:00 2
@Masoud2023 是的,对于多数 crud 直上直下 service mapper 功能已经重复了,service 本来应该组织业务逻辑和事务等反而没有体现出来,其实对于只有 crud 直上直下这种其实 mapper 都可以不需要存在,只有 model(entity) 即可,尽信模式不如没有模式,简单的 crud 无需这么多层
|
38
dc2002007 2023-11-13 13:54:20 +08:00
我始终认为 orm 的玩法才是正道,其他都是玩具
|
39
summerLast 2023-11-13 13:56:43 +08:00
@cslive 灵活是以可读性和调来调去查看 map 里面是啥为代价,当这段代码只面向前端还好,当多人配合时 map 里有啥,idea 的提示就全废了,bean 是一种 struct ,提供了一定程度的约束
|
40
cvbnt 2023-11-13 13:59:50 +08:00 via Android
因为灵活,可以创建 sql 片段,动态 sql 可以应付最复杂的分支
|
41
nothingistrue 2023-11-13 14:01:20 +08:00
一堆人用,不一定是好用,而往往是没得选。如果你不用 mybatis ,那么剩下的只有两条路:Hibernate ,但是门槛高,不适合国情;啥也不用直接用 JDBC + 手写 SQL ,项目规模稍微超过 「 Hello World 」就更麻烦了。(其实还有 JPA 的其他实现,但是比 Hibernate 门槛更高还不一定有它好用)
上面说得是体系区分,实际应用中,不管是 mybatis ,还是 Hibernate ,直接用都还是更麻烦,还会有上层封装来做可用性提升。像 mybatis 就有 Mybatis Plus (这俩其实是不同开发团队搞的,不应该混为一谈),Hibernate 则是 Spring Data Jpa 。 关于 Hibernate/Jpa 的门槛,需要说一句,它并不只是它们本身的学习门槛,而是设计理念和开发过程门槛:你不一定非要用 DDD ,但一定是拿「实体」或「模型」来作为需求或业务的主要描述语言。 |
42
yohole 2023-11-13 14:03:57 +08:00
这不是 mybatis 的锅,而是 java 过度设计的锅
|
43
twofox 2023-11-13 14:09:48 +08:00
JPA 党都是推崇,什么不用写 sql 啦,入手快啦,实在不行我还能写 JPSQL 之类的
但当我真的打算用 JPA 去做企业应用的时候,就难受的一批 你们真的明白一个查询几百行 sql 的感觉吗 是,是可以把逻辑抽取到代码里面执行 我何必啊?大部分都是中间表明细表,我还得单独为这十多个表建 entity ?我只需要为结果负责就可以了,中间的规范并不重要 性能? Oracle 数据库,硬件继续堆,企业应用又不需要互联网这么高的并发,硬件够我照样能跑 mybatis 还可以做很多 DDL 的骚操作,JPA 用起来就显得麻烦 我自己的项目当然可以按照 JPA 的规范,从头到尾设计的漂漂亮亮,按照开发规范设计 但是按照这样设计之后,遇到复杂的业务逻辑,累的还不是我自己? sql 一把梭哈,做完项目拿完奖金就改跳槽下家了 还隔这代码规范呢,代码我都想给他混淆再留下来 |
44
shyangs 2023-11-13 14:19:17 +08:00
以為 JPA / Hibernate 不能裸寫 SQL ,就和用了 jQuery 以為 jQuery 不能混寫 JavaScript 一樣奇葩.
就像 jQuery 會鼓勵你用 jQuery, 因為一旦你裸寫混寫 JS (比如混寫原生 Array.prototype.indexOf ,而不用 jQuery.inArray ),就會失去跨瀏覽器的抽象. 所以 JPA 一樣鼓勵你 JPL, 少用 nativeQuery. 我參與過一個項目用 JPA 相容了三種資料庫,Oracle , SQL Server, MySQL. (因為要部署在客戶的環境,客戶會考慮 DB 價錢.)(裸寫 SQL 就像停留在 ES3 時代,沒跨入 jQuery 時代) |
45
dif 2023-11-13 14:47:43 +08:00
JPA 也用过,MyBatis 也用过,目前的业务只有 mybatis 最顺手。
之前做 CMS 的时候,jpa 顺手。 用哪个取决于项目。 |
46
angryfish 2023-11-13 14:49:14 +08:00
@weijancc 像一些后台管理类的代码,很多是简单的 curd ,不超过 5-10 行的,直接在 controller 写问题不大的,要 controller 与 service 里面跳来跳去更烦。
|
47
Leviathann 2023-11-13 14:51:56 +08:00
hibernate 搞 dto 之类的很大一部分原因是 entity 是由 hibernate 管理,hibernate 会自动把内存中的 entity 的状态和数据库同步,所以要隔离前端传来的数据和数据库数据
mybatis 搞这么多层是? |
48
skwyl 2023-11-13 15:38:02 +08:00
什么一堆层?基础的 mvc 的话 Dao service Controller 还有 对应的 Model ( entity ) entity 就是接收数据库数据映射的。至于其他 VO BO PO DTO 都是出于业务需要增加的
|
49
wanguorui123 2023-11-13 16:00:36 +08:00 2
1 、思想:
mybatis 面向过程开发 JPA ( Hibernate )面向对象开发 2 、侧重点: mybatis 采用 XML 管理 SQL 比较直观,查询多的场景比较自由灵活、缺点存一些符号冲突(<>),管理思想还是面向过程,需要通过 Plus 加强对象管理 JPA 将数据库完全映射为对象需要有业务的整体设计能力,JPA 优势是简单的 CURD 根本不写 SQL ,JPA 缺点就是需要了解数据状态同步管理,复杂的业务尤其需要了解实体各个阶段状态,以及复杂的连表查询需要调用 JPA 的原生查询接口或者 DSL 3 、抽象能力 mybatis 使用原生的 SQL 方言,迁移能力比较差 JPA 使用 HQL 屏蔽了底层方言差异抽象的比较彻底,迁移能力比较强 |
50
BBCCBB 2023-11-13 16:01:28 +08:00
你需要被其他 orm 框架教育一下.
|
51
issakchill 2023-11-13 16:12:18 +08:00
|
52
sub166 2023-11-13 16:16:14 +08:00
@summerLast #39 面向前端也不行,都用 ts 了,然后接口一堆 any ,想想就头大
|
53
Poluk 2023-11-13 16:23:13 +08:00
@Masoud2023 受教了,老哥,感谢。
|
54
mmdsun 2023-11-13 16:26:20 +08:00
看了一圈,问下有人用 Spring Data R2DBC 吗?
https://spring.io/projects/spring-data-r2dbc |
55
aliger 2023-11-13 17:09:39 +08:00
jpa 坑太多了,直接过滤
|
56
aragakiyuii 2023-11-13 17:12:18 +08:00 via iPhone
jpa + jdbcTemplate
|
57
tairan2006 2023-11-13 20:51:14 +08:00
一堆层和 mybatis 没啥关系,纯粹是 java 的一般抽象结构…
而且这个结构其实还蛮合理的,除了 service 必须写个接口算是糟粕。 |
58
dawnflyc 2023-11-13 21:39:37 +08:00
我也觉得 mybatis 得手写代码,简单的也得手写,虽然 mybatisplus 可以不用手写简单的 sql ,但是限制很大,比如不能连表。
而且我也不懂为什么数据传来传去都得用实体类 哪怕传一个 id 都得用个实体类,在写接口的时候,会接收一些其他的参数,不可能只会出现数据库字段,于是又得扩展实体类。 所以我下定决心开发出了一套库,以上的都改了,我大概描述下: |
59
xuanbg 2023-11-13 21:42:21 +08:00
我用 mybatis ,根本不用写任何的 xml 。直接注解写 sql 就行。
|
60
dawnflyc 2023-11-13 21:45:42 +08:00
@dawnflyc 直接将 sql 相关的语法转换成 java 的那一套,比如 Select(表名).field(字段).where("id",1).and().where("age",">",3).order("time")。大概这样,伪代码展示下,联表的话,join("left","user","order.user_id=user_id"),这样可以避免输入错误。然后也返回 list 和 map ,没有对象那一套,service 传的话,也是需要什么传什么,如果非得实体类 比如一下子传很多,也可以传 然后查询的时候拆了,这块我也没有怎么思考,所以很粗略。
|
61
dawnflyc 2023-11-13 21:49:37 +08:00
@dawnflyc 手残分出好几个来,以上就是抛砖引玉了,https://github.com/dawnflyc/JqlApi
分为几个库,一个 api 库定义了语法之类的,然后如果用 mybatis 的话 需要一个 mybati 实现库,如果用 jdbc 的话,需要一个 jdbc 实现库,需要什么导入什么,只是封装而已,并没有写核心的东西,以为我水平也达不到。 |
62
Poluk 2023-11-13 22:19:35 +08:00
@dawnflyc #58 小哥,我想请教你一下。我前段时间跟着一个项目,基本没写什么联表。
比如说一个返回结果他要包括两张表的信息,但是在 sql 里讲师并没有去写连表查询,而是用一个包含了那两张表字段的类,作为 VO 封装类返回,然后在 Service 层里,通过一些方法去把那两个实体类对象的字段 set 到 VO 封装类里,最终返回。 我在想这样是不是也能去写 sql 的连表查询吧,因为在 Service 层里,针对这个查询功能写的逻辑比较多,有一点点繁琐。一般现实开发环境中,连表查询写的多?还是我描述的这种方法居多?或者根据业务需求决定的? |
63
cnzjl 2023-11-13 22:34:09 +08:00
为什么不直接用 jdbcTemplate 呢
|
64
huigeer 2023-11-13 22:38:41 +08:00
java 这么强悍的面向对象语言,居然还要手搓 sql ,搞个舒服的 orm 不可以吗? 还是 laravel 的 orm 嗨皮
|
67
dawnflyc 2023-11-13 23:05:32 +08:00
@Poluk 那如果又有一个接口 不需要那么多字段 因为会泄露信息吗 那又得新建一个 vo ,太麻烦了。一般联表挺多的呀。我之前那个项目 有小区、楼栋、单元、楼层、户,然后就是一长链,然后就需要挨个查,一长链联表,很折磨。我也是一个新手呀
|
68
Poluk 2023-11-13 23:47:45 +08:00
@dawnflyc #67 确实,那个项目因为有些查询不需要那么完整的字段,然后又担心泄露,确实建了几个 VO ,搞得还挺麻烦的。
|
69
PlsDontStop 2023-11-14 00:11:37 +08:00 via iPhone
事实上除了国内也没人用这玩意
|
70
Znemo 2023-11-14 00:32:47 +08:00
技术上没有什么东西能同时满足解决复杂的问题并保持简洁,如果有,那只能说明问题不够复杂。就像 JPA/Hibernate 或者 Spring Framework ,了解的多才有信心写得少。
|
71
aristotll 2023-11-14 01:01:12 +08:00
jooq 其实也不错 逃
|
73
ysw 2023-11-14 01:19:03 +08:00
@aristotll 发现 Java 和数据库相关的怎么那么多都是有收费选项的,flyway 和 liquibase 也是这样的,redisson 也是
|
74
gongquanlin 364 天前
楼上都说为啥明明一个 List<Map<K,V>>就能解决的问题非要建一堆 vo 、bo ?
说明接手的二开和维护的项目少,看看一堆不按开发规范的 SB 写的代码,返回直接用 map.put 搞,简单的业务逻辑还好,复杂的业务逻辑得从这个函数甚至其他类、函数开始看,一点点的捋才知道这个 map 有哪些字段;调试的时候挂了还好,生产一挂,日志没有,纯靠瞎猜 有了 vo 、bo 、dto 之后,debug 只需要看下对应的 pojo 就知道这个函数返回啥了,就算注释少,只要按着开发规范基本上都能看到个七七八八,心智负担大大降低。以前我也觉着写这 b 玩意麻烦,但是现在这么多 json 转 bean 工具,最多多几十秒的工作量,维护起来真的是香的不行 |
75
looo 364 天前
@gongquanlin 赞同,写 Map/JSON/BeanUtils.copy/动不动就自己造轮子,感觉大部分都是被外包带坏了,这种项目如果后面加功能/维护,那会就想日个🐎了
|
76
zoharSoul 364 天前
就一层啊 哪有一堆层
|
77
bill110100 364 天前
@Aresxue mybatis 怎么不叫 orm ?
|
78
bill110100 364 天前
@dawnflyc 不建 vo ,光用 map ,你怎么知道 map 里有哪些数据?今天你能记得,一年后呢?更不用说其他引用的人,一个 map 传数据,他怎么知道你 map 里有什么?
|
79
Aresxue 364 天前
@bill110100 orm 的全称是 Object/Relational Mapping ,比较典型的特征就是你只管操作对象框架会帮你把对象的变更映射到数据库,mybatis 本身只是存放 sql 不存在有时候连表对应的对象可能都不会存在,mybatis plus 才是 orm ,而如果要说到更纯正的 orm 还要用到 Active Record 模式,像 python 中的 SQLAlchemy 、c#的 Entity Framework 都是比较纯正的 orm 。
|
80
Jrue0011 364 天前
国内 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 了。 |
81
dawnflyc 364 天前
@bill110100 所以我那个并不完善,也许可以实体类和 map 共存,并且互相转换,比如大量需要用的时候就用实体类,而只是一个简单的接口,那就没必要新建一个 vo 了
|
82
chuck1in 360 天前
新人不推荐学 mybatis ,包括那个什么 mybatis-plus 这种东西。。。。
没有历史遗留问题的话还是上 jooq https://www.jooq.org 吧,现在社区都是这个玩意儿了。 至于 jpa 的话,jpa 的学习成本比较高,你写的时候要理解很多概念。用 react 的话来说就是心智负担很大。 |
83
chaoschick 73 天前
说的很好 但是我用 JDBC 🐶
|