学习 springboot 的困惑

2020-06-26 16:47:28 +08:00
 fxjson

一直比较抵触编译型语言,可能是我太懒了,感觉干啥都费劲和麻烦,搭建过 ssm,最终因为感觉配置麻烦而放弃,接触了 springboot,感觉还是蛮好的,一些默认配置已经帮我们做了,现在学习到集成 db,貌似可选的有 jpa 个 mybatis, 尝试写了个 user 表,忽然发现 mybatis 挺灵活,但是感觉写 xml 总感觉不爽,不知道大家的实际项目中用的什么 db 层

10244 次点击
所在节点    Java
83 条回复
hantsy
2020-06-27 13:43:28 +08:00
@fxjson 你可以看看 Spring Data Jdbc,定义一套 Annotations 完成 OR Mapping 。目前感觉 R2dbc (和 Spring Data R2dbc ) 不错,API 比较友好,可是与 Spring Data Jdbc 还有点差距,1 。0 还不支持 projection.

现在的 API 操作都是慢慢支持 ReactiveStreams 了,更新换代太快了。
hantsy
2020-06-27 15:55:41 +08:00
@dcalsky 尽可以回避写 HQL,JPQL 字符查询,使用 Typesafe 方式的确可以减少很多低级 Typo 错误,特别开发期间更新频繁的时候。

EntityGraph 估计这里写 Java 的,只有极少人用过。https://github.com/hantsy/ee7-sandbox/wiki/jpa-entitygraph
xiaogui
2020-06-27 17:01:37 +08:00
jpa 就差不多,除非说是特复杂的 sql 用 query
Uyuhz
2020-06-27 17:45:33 +08:00
新接手的老项目,几百行的 sql,还手动拼接全写在业务代码里,看着纯粹恶心人,这时候我就会特怀念 xml 了
ONCEsama
2020-06-27 18:43:58 +08:00
JPA 是一种规范,Hibernate 是一种实现,目前互联网的两大 ORM 框架就是 Hibernate 和 MyBatis 了,而且 MyBatis 的写法不只有 xml,还可以通过注解来实现的,只是因为 xml 的写法比较清晰,需要修改的时候会方便很多。
hekaihao2015
2020-06-27 21:50:35 +08:00
@ONCEsama MyBatis 企业开发还是用 xml 比较好,xml 可以直接看 sql 语句,注解的话还得去代码里查这个方法的语句
yannxia
2020-06-27 22:02:50 +08:00
@hantsy 早期 JDK 不支持多行 SQL,写 native 很恶心,不如直接 mybatis 写 xml 里面。复杂查询的 hql 也不是很好用。 总之连接数据库的操作都不太爽。
hantsy
2020-06-27 22:50:27 +08:00
@yannxia 遇到的一些项目,不允许用任何字符 XQL,客户强制要求。开始很不习惯,现在我也觉得很有道理,可以有效避免一些运行时低级拼写错误。全部 Typesafe 后,借助 IDE 代码辅助,IDE 检测范围大得多,很多查询相关的错误在编译前就解决了。

XML 配置就不说,远古时代的。
hantsy
2020-06-27 22:55:06 +08:00
yannxia
2020-06-27 23:06:50 +08:00
@hantsy 以前我也这么用,JOOQ 之类的也是如此,但是有一些很麻烦的点,比如经常需要判断 null,然后确定是不是要进行增加查询条件,这一部分代码我认为是对代码逻辑的污染,就有点像注解太多对代码的理解产生了干扰,不如把这一些东西都扔到 XML 里面,在业务层只是增加 @notnull @nullable 来确定是否可以为空给调用者警示即可。

另外,HQL 生成的 SQL 非常的啰嗦,复杂查询并不是很友好,尤其是需要 DBA 帮助优化 SQL 的时候还需要 DBA 先简化。JOOQ 这点做的就挺好,所见所得。
sagaxu
2020-06-28 00:05:11 +08:00
@yannxia 把查询剥离出来,统统扔到 xx.xml 里,和扔 xx.java 里,有什么不同吗? xml 的表达能力很弱,非常不适合做 dsl,
cheng6563
2020-06-28 00:25:12 +08:00
@sagaxu 但是 Java 连多行字符串都不支持,写 Java 里更难受啊。
GPLer
2020-06-28 08:28:06 +08:00
@cheng6563 JDK 13 支持了 Text Blocks 。
hantsy
2020-06-28 09:24:18 +08:00
@sagaxu 老外的一个观点,放 XML 里面开发的时候很难维护,效率太低。比如,Mybatis 之类的,一个 TableName 写错了,dog->doge,或者哪里重新命名改动,另外几处忘记改了,IDE 几乎没有什么提示,要运行时才报错误。但是 JPA,用 TypeSafe 方式 ,用 MetaModel Classes 时候就完全不一样,任何属性重新命名,立即会影响到 Meta Classes,IDE 会立即提示有问题,不必等到运行时检测。

XML 配置和写 SQL 的回忆, 对于我来讲,我觉得恶梦一般。有段时间连 XML 解析技术都是讨论的问题,比如 DOM 解析,还是逐个节点解析。
Hibernate 支持 Annotations 就立即丢掉了 XML 。
JPA 中我从来没用过 XML 配置。
Spring 从 3 。0 开始一部分用 Annotations,到了 3 。2 后几乎再没有用过 XML (除了一些没办法基础的启动配置)。
hantsy
2020-06-28 09:37:40 +08:00
我也不知道 SQL 写在 Java 里面和 XML 有什么差别。

试用过 Helidon 的 DbClient,把 SQL 写在 Java 里面,写这个版本花的时间比 JPA 长的多,感觉回到解放前,太难受。

https://github.com/hantsy/helidon-sample/blob/master/se-dbclient/src/main/java/demo/PostRepository.java
yannxia
2020-06-28 09:43:14 +08:00
@sagaxu 单纯说的 SQL 语句,这个 XML 表达能力 和 JAVA 差不多平级,SQL 本身就是一串文本,不需要什么类型之类的东西。 对于我来说,我觉得放在 Java 里面本身就是一种污染,因为那部分我的逻辑我认为归属于 SQL 的范畴,不是 Java 所编写的业务系统的范畴,我更倾向于把 SQL 查询作为一个黑盒看待。
yannxia
2020-06-28 09:45:02 +08:00
@hantsy 上帝归上帝,凯撒归凯撒。SQL 归 XML 管,代码逻辑归 JAVA 管,认可这个才有后面用 Mybatis 的共识。
jimrok
2020-06-28 10:05:32 +08:00
能用 jpa 就不要用 Mybatis,Mybatis 这种设计有时代局限性,最早的应用都是单数据库应用,跨表查询比较常见。随着规模扩大,很多应用都是多数据库的系统,并带有 nosql 的数据库加入,不需要做复杂的 join 。而且 Mybatis 这种分离业务逻辑代码和 sql 代码的配置方式可读性并不好,你需要 xml 文件和 java 跳跃的看才能把逻辑看明白。
hantsy
2020-06-28 10:12:06 +08:00
@jimrok

NoSQL 才是搅局者。

现在我有的项目完全不用 RDBMS,有的混用 NoSQL 和 RDBMS 。
lancelock
2020-06-28 10:56:25 +08:00
@hantsy 现在 NoSQL 一般用什么数据库啊?

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

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

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

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

© 2021 V2EX