学习 springboot 的困惑

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

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

10244 次点击
所在节点    Java
83 条回复
liuzhen
2020-06-28 11:13:57 +08:00
jpa 最好,受不了 Mybatis 的那一堆复杂 sql,有些人自认为自己 sql 编写能力强,什么业务都喜欢一条长 sql 搞定,上百行的 sql 后面维护者看着想死
fxjson
2020-06-28 12:12:53 +08:00
@liuzhen 那关联查询怎么拆分,或者要根据外键查询另一个表的数据,要拆分表查询?
liuzhen
2020-06-28 12:21:47 +08:00
@fxjson jpa 可以 join 多表啊子查询都可以,可以返回多表字段为一个 map,返回自定义 DTO 不是太方便
liuzhen
2020-06-28 12:22:51 +08:00
@fxjson 一般的表设计字段时候适量冗余吧,尽量避免多表
hantsy
2020-06-28 12:52:22 +08:00
@lancelock 看场景吧。

NOSQL 有几大派系,Document,KeyValue,Graph,Column 。

Mongo 是比较通用的 Doucment 典型代表,可能也是应用最广泛的 NoSQL 。API 也比较友好 ,不管是 Java 语言,还是 JavaScript 。

我项目第一次引入 NoSQL 是用 Mongo 的 Gridfs,用来存储上传文件。后来有些小项目,直接全部用 Mongo 了。

Redis 可以用在一些临时存储,比经常遇到的什么验证码之类,用 Redis,设置一个时间点,过期自动删除,删除的工作不用代码实现。或者 Key Value 场景,特别是一些统计,比如一些页面浏览器,(可以用消息传递),Redis 存储,提供 API 显示(只读)。另外,Redis 本身也可以用做消息 Message Broker,轻量级的。

关系型模型最牛逼的还是 Neo4j 这种 Graph 数据库,不过它的查询语言又是一门新语言了。这实际就是数据结构 Graph 的实现,用于查询路径的场景太容易。如,对应 SocialNetwork 中两个人关系深度,a->b->c->d, 查询 a->d 的关系深度( LInkedIn,脉脉都有这样的场景,至于它们怎么实现就不知道)。另外,比如,常见的物流路线跟踪之类,非常实用。
hantsy
2020-06-28 13:15:24 +08:00
@fxjson 再说说查询。在 V 站,我常常看到说查询复杂离不开 SQL,所以要用 MyBatis 这种 SB 一样的工具。
现在整个 V 站一些讨论,一看到什么复杂查询,很多人很扯蛋的就一竿子捅到数据库( RDBMS )和 SQL 。实话说,MySQL 这种数据库,一个表中数据量稍一大了,查询性能就会断崖式的下降。

好几年前,我做过一个海外项目,用到多个数据库,大部分的代码都是 JPA 和 Postgres,初期开发完全不考虑复杂查询,所以大部分都是单个 Entity,甚至很少用 HQL 和自定义查询语言( Criteria ),大部分都是可以用 Spring Data JPA 的约定解决。

那么总有人说,如果遇到怎么样怎么样的场景,比如要搜索产品库,牵扯到其他的情况怎么办?

互联网应用,页面 80%情况都是用一个输入框关键字搜索。所以所有的全文搜索(包含一些条件)场景,最后都是聚合到 Elastic Search 中(事先通过 Message Broker,Schedule ),建立索引。要知道在 ES 这里一样,同样没有联合查询,所有用到的数据都有一个 Aggregate Root,关联数据全部在一个 Document 里面。查询效率比 SQL 联表不知道高出多少倍,数据量到百万还可以做 MS 级查询。

另外,对于 RDBMS 系统查询,为了提高效率,生产环境 JPA 开启二级缓存,比如用高性能的 Hazecast,实际项目其他很多场景都大量使用 Hazecast Spring,提高性能。

真正,我经历的一些好的项目的系统架构设计,查询基本上跟数据库边都沾不上,大部分情况数据都是来源于缓存服务器或者 ES 这种服务器。
hantsy
2020-06-28 13:18:16 +08:00
@liuzhen 很多人可能从来没有这个特性。

select new com.example.SampleDto(user.name, user.age) from User user

map 好像是 Hibernate 特有的,不是标准。
hantsy
2020-06-28 13:30:27 +08:00
对于互联网数据这个处理,我想到三国那句话。天下大势,合久必分,分久必合。开发的时候尽可以业务细化,分而治之,化繁为简。产品上线根据需求,将一些数据聚合呈现。
chaos3
2020-06-28 16:00:13 +08:00
这些不都是模版模式调用 数据库吗。就好像微信支付和支付宝支付哪个能更简单买东西的问题一样。看项目的喜好和选择吧。本质没啥不一样啊。
mysunshinedreams
2020-06-28 17:09:32 +08:00
@felixin JOOQ 前期配置有点啰嗦。
Saurichthys
2020-06-28 17:14:09 +08:00
用 nutz 项目上 95%可以不用 sql,5%复杂语句,可以考虑用视图或者是自定义 sql 语句
limuyan44
2020-06-29 00:17:13 +08:00
楼里谈论这么多其实没啥用,在中国,肯定是 mybatis 用的最多的。至于为什么选 mybatis,也许是这些人不混 v 站。
Alex5467
2020-06-29 09:27:31 +08:00
使用 SpringBoot 你完全可以不用 xml 写 sql,用注解就可以搞定。
Alex5467
2020-06-29 09:29:26 +08:00
实际项目中用什么取决于项目复杂度吧,用 jpa 能解决复杂的关联查询吗。
Alex5467
2020-06-29 09:31:26 +08:00
@wjup 看国外网站统计的也有一部分人用 JdbcTemplate,mybatis 只占 20%,jpa 占大多数,很好奇复杂的 sql 他们怎么写的
Alex5467
2020-06-29 09:35:03 +08:00
@Sendya 是的,看团队的,团队大部分人都用的,自己一个人用无所谓,随便折腾
fxjson
2020-06-29 12:00:05 +08:00
@Alex5467 我也好奇
memos
2020-06-29 12:19:19 +08:00
@Alex5467 jdbcTemplate 有个不好的地方,返回 Map 对象时,如果查询数据为空就会报错😂😂
ltfree
2020-06-29 15:05:58 +08:00
mybatis xml 70% 80%公司都是这么干的,习惯就好了
liuzhen
2020-06-30 14:03:43 +08:00
@hantsy 谢谢,之前找过 jpa 怎么返回自定义 DTO 的方式,没找到能用的方法

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

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

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

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

© 2021 V2EX