一直比较抵触编译型语言,可能是我太懒了,感觉干啥都费劲和麻烦,搭建过 ssm,最终因为感觉配置麻烦而放弃,接触了 springboot,感觉还是蛮好的,一些默认配置已经帮我们做了,现在学习到集成 db,貌似可选的有 jpa 个 mybatis, 尝试写了个 user 表,忽然发现 mybatis 挺灵活,但是感觉写 xml 总感觉不爽,不知道大家的实际项目中用的什么 db 层
1
darrenfang 2020-06-26 17:00:42 +08:00 via iPhone
jpa
|
2
BenjaminReed 2020-06-26 17:01:30 +08:00 2
|
3
murmur 2020-06-26 17:03:45 +08:00 4
xml 才灵活呢,你写复杂一点的 sql 写到 annotation 里光一个排版就恶心死你
|
4
dcalsky 2020-06-26 17:07:04 +08:00 via Android
借楼问,用 jpa 的同学是按照最佳实践来用的吗( entitygraph 之类的),还是只用 @query 写 sql ?
|
5
felixin 2020-06-26 18:35:50 +08:00 via Android
试试 jooq
|
6
draymonder 2020-06-26 18:52:18 +08:00
数据量小 直接查全表,然后程序负责 join 就好了, 关联比较多的话 用 mybatis 好
|
7
Mcorleon 2020-06-26 19:04:03 +08:00 1
都用 springboot 了难道不是注解+application.yml 一套解决了吗?估计你使用姿势有误
|
8
napsterwu 2020-06-26 19:06:03 +08:00 via iPhone
复杂 sql 不用 xml 写就是给自己挖坑
|
9
EastLord 2020-06-26 19:06:53 +08:00
mybatis 和 jpa 一起用,复杂查询用 mybatis
|
10
xuanbg 2020-06-26 19:37:34 +08:00
mybatis 也可以用注解,不写 xml 。
譬如: /** * 查询报表模板 * * @param dto 查询参数 DTO * @return 报表模板集合 */ @Select("<script>select id, `code`, `name`, remark, is_invalid from icc_template where tenant_id = #{tenantId} " + "<if test = 'keyword != null'>and (`code` = #{keyword} or `name` like concat('%',#{keyword},'%')) </if>" + "order by created_time</script>") List<TemplateDto> getTemplates(SearchDto dto); |
11
echo1937 2020-06-26 19:52:37 +08:00
mybatis 和 jpa 一起用,复杂查询用 mybatis
|
12
CoderGeek 2020-06-26 19:56:35 +08:00
jap
|
13
wjup 2020-06-26 19:57:30 +08:00 via Android
JdbcTemplate
|
14
CoderGeek 2020-06-26 19:58:24 +08:00
MyBatis-Plus
还有种叫 AR ( Active Record ) java 的 ORM 很多 |
15
pomelotea2009 2020-06-26 20:02:34 +08:00 via Android
#7 和#10 正解,排版你自己换行加缩进(没找过有没有插件可以自动格式化),动态 sql 用<script>注意特殊字符的转义
Spring data jpa 也有 Native 查询,只是动态 sql 就没那么灵活,而且如果要动态表名 /动态排序分页也不太好办 |
16
anguiao 2020-06-26 20:05:50 +08:00 via Android
一般情况下我都很讨厌 XML,但是 MyBatis 的 XML 并没有很复杂,反而很灵活,所以我并不抵触。
|
17
cheng6563 2020-06-26 20:36:38 +08:00 via Android
原生 mybatis 挺不好用的,用 mybatiscplus 吧
|
18
xiangyuecn 2020-06-26 21:42:12 +08:00
@murmur #3 不喜欢 mybatis 的原因就是因为:它太拘泥于要创建 xml 文件了。如果能用 xml 字符串也不会有这么嫌弃,哪里要用定义到哪 豪情奔放😂 最后我用 SqlMapper,这样就不用再去定义 xml 文件也能用上 mybatis 的高级特性。
|
19
nullpointerskz 2020-06-26 21:43:30 +08:00
领域驱动设计+jpa
|
20
murmur 2020-06-26 21:44:50 +08:00
@xiangyuecn 企业应用开发不可能不写 sql 的,稍微几个复杂查询和报表叫各种教做人,简单的查询 hibernate 真挺好
|
21
yannxia 2020-06-26 22:34:21 +08:00
Jooq 好一点也好不太多,Mybatis 就和写 Sql 没啥区别,Jpa 复杂 Query 还不如写 SQL 。
总而言之,都不太爽。 |
22
levon 2020-06-26 23:00:24 +08:00
用过 entityframework 的我再去 xml 写 sql,以前的我就是这么拒绝 spring mvc 的,不过现在又被逼回来写屎一样的 xml,每次写都很不爽。
|
23
sagaxu 2020-06-26 23:18:21 +08:00 via Android
简单的查询走 jpa,复杂的 jdbctemplate 走起,mybatis 现在基本上只有中国人还在用
|
24
alcarl 2020-06-26 23:27:45 +08:00 via Android
没有多种数据库支持需求的话,xml 写可以最大化发挥数据库各种原生特性来写复杂查询简化代码提高效率,随意优化查询。数据库懂得越多 xml 越香
|
25
Muyiafan 2020-06-27 00:15:16 +08:00
jpa + querydsl
|
26
tctc4869 2020-06-27 01:57:06 +08:00 via Android
mybatis 本质就是面向模板引擎,自己用 freemaker 做 sql 模板引擎
|
27
ericgui 2020-06-27 02:33:53 +08:00
如果有人给你支付工资,并且你不是一个人在战斗,我觉都还好
别你自己一个人玩,没人付钱,而且卡在某地地方还没办法找人上了,就傻了 |
28
hellofrank 2020-06-27 09:13:19 +08:00
简单的 crud 用 jpa, 复杂的上 mybatis.
另: java 技术讨论 qq 群:731376782,欢迎各位加入 |
29
magiclz233 2020-06-27 09:16:50 +08:00
jpa 就是 hibernate 那一套,mybatis sql 比较灵活,我觉得看你表结构的复杂程度吧 如果很复杂的话, 用 mybatis 好点,如果比较简单 或者说表结构不停变 加字段或者减字段 那就没必要用 mybatis
|
30
micean 2020-06-27 09:24:09 +08:00
纯 sql 写多了还是喜欢 mybatis,idea 配置了数据库之后也不存在字段变更导致的 bug 忽视问题
|
31
matthewxu123 2020-06-27 09:31:07 +08:00 via Android
@murmur 你不知道 jpa 或者 jdbcTemplate 都可以写进 properties?
|
32
murmur 2020-06-27 11:54:29 +08:00
@matthewxu123 你 properties 能换行么
|
33
murmur 2020-06-27 11:56:32 +08:00
@matthewxu123 斜杠和加号拼接一样,可以,但是视觉上不够优雅
|
34
hantsy 2020-06-27 12:50:09 +08:00
首先,纠正一下。Java 不一定要编译才能运行。
Java 已经可以直接运行***单个源文件***,某种程序上说,可以将 Java 当成 Script 来用了,现在有一些 Infra as code 脚本工具也是支持 Java 的。 https://www.infoq.com/articles/single-file-execution-java11/ |
36
Sendya 2020-06-27 12:52:56 +08:00 via Android
我前单位,数字货币项目,并发非常高,用的还是 spirng data jpa 依旧很稳,技术栈 要全公司开发大部分愿意才好选择
|
37
oneisall8955 2020-06-27 12:53:37 +08:00 via Android
置顶好骚啊
|
38
hantsy 2020-06-27 13:09:48 +08:00
@Sendya 任何技术使用好坏都是和人有关。还有任何技术都是为了解决某方面的问题,而不是全能王。
从程序设计上讲,JPA 解决了 OOP 和 Data Modeling 不匹配的问题,使用 JPA 能够最大程序的发挥 OOP 语言的特性。而不是困在 RDBMS 的泥潭了。 对于使用 JPA 有问题的人,只是有一点 SQL 基础,完全不懂 OOP 抽象,也不愿意学习 JPA 那一套 API 而已。以前帮朋友面试过一些 Java 候选者,有个 Java 5,6 年的说 Hibernate,MyBatis 对比说得头头是道,说自己大量的实战经验证明 Hibernate 不行。结果问了一个基础中的基础问题,我们提到维护 Hibernate Session(对应 Hibernate 一级缓存)的里的对象状态有几状态,怎么维护(和变迁的),他脑子好像空白,根本就不知道这 Session 是什么东西。 总有一些人无端的报怨 JPA 不方便,性能, 什么的,说白了自己的问题,绝大部分这些人都没有系统的学习过 JPA 。 JPA 如果你没有能力掌握,你说你的 MyBatis 写的代码性能比 JPA 好,不是笑话吗? |
39
hantsy 2020-06-27 13:28:08 +08:00
@sagaxu 没错。
我从来没有遇到在国外项目看到有人使用过 Batis,MyBatis 。Spring JdbcTemplate 配合 Java 8 语法还不错,写起来与 Helidon DbClient 差不多。 再说回来,老外的项目,我遇到他们死磕要全部代码 Typesafe,不允许用字符的查询语句,他们推荐一些复杂查询用 JOOQ,后来我还用 Criteria API 完成了。 |
41
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 了,更新换代太快了。 |
42
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 |
43
xiaogui 2020-06-27 17:01:37 +08:00
jpa 就差不多,除非说是特复杂的 sql 用 query
|
44
Uyuhz 2020-06-27 17:45:33 +08:00 via Android
新接手的老项目,几百行的 sql,还手动拼接全写在业务代码里,看着纯粹恶心人,这时候我就会特怀念 xml 了
|
45
ONCEsama 2020-06-27 18:43:58 +08:00
JPA 是一种规范,Hibernate 是一种实现,目前互联网的两大 ORM 框架就是 Hibernate 和 MyBatis 了,而且 MyBatis 的写法不只有 xml,还可以通过注解来实现的,只是因为 xml 的写法比较清晰,需要修改的时候会方便很多。
|
46
hekaihao2015 2020-06-27 21:50:35 +08:00
@ONCEsama MyBatis 企业开发还是用 xml 比较好,xml 可以直接看 sql 语句,注解的话还得去代码里查这个方法的语句
|
47
yannxia 2020-06-27 22:02:50 +08:00
@hantsy 早期 JDK 不支持多行 SQL,写 native 很恶心,不如直接 mybatis 写 xml 里面。复杂查询的 hql 也不是很好用。 总之连接数据库的操作都不太爽。
|
48
hantsy 2020-06-27 22:50:27 +08:00
@yannxia 遇到的一些项目,不允许用任何字符 XQL,客户强制要求。开始很不习惯,现在我也觉得很有道理,可以有效避免一些运行时低级拼写错误。全部 Typesafe 后,借助 IDE 代码辅助,IDE 检测范围大得多,很多查询相关的错误在编译前就解决了。
XML 配置就不说,远古时代的。 |
49
hantsy 2020-06-27 22:55:06 +08:00
|
50
yannxia 2020-06-27 23:06:50 +08:00
|
51
sagaxu 2020-06-28 00:05:11 +08:00 via Android
@yannxia 把查询剥离出来,统统扔到 xx.xml 里,和扔 xx.java 里,有什么不同吗? xml 的表达能力很弱,非常不适合做 dsl,
|
54
hantsy 2020-06-28 09:24:18 +08:00 1
@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 (除了一些没办法基础的启动配置)。 |
55
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 |
56
yannxia 2020-06-28 09:43:14 +08:00
@sagaxu 单纯说的 SQL 语句,这个 XML 表达能力 和 JAVA 差不多平级,SQL 本身就是一串文本,不需要什么类型之类的东西。 对于我来说,我觉得放在 Java 里面本身就是一种污染,因为那部分我的逻辑我认为归属于 SQL 的范畴,不是 Java 所编写的业务系统的范畴,我更倾向于把 SQL 查询作为一个黑盒看待。
|
57
yannxia 2020-06-28 09:45:02 +08:00
@hantsy 上帝归上帝,凯撒归凯撒。SQL 归 XML 管,代码逻辑归 JAVA 管,认可这个才有后面用 Mybatis 的共识。
|
58
jimrok 2020-06-28 10:05:32 +08:00
能用 jpa 就不要用 Mybatis,Mybatis 这种设计有时代局限性,最早的应用都是单数据库应用,跨表查询比较常见。随着规模扩大,很多应用都是多数据库的系统,并带有 nosql 的数据库加入,不需要做复杂的 join 。而且 Mybatis 这种分离业务逻辑代码和 sql 代码的配置方式可读性并不好,你需要 xml 文件和 java 跳跃的看才能把逻辑看明白。
|
61
liuzhen 2020-06-28 11:13:57 +08:00
jpa 最好,受不了 Mybatis 的那一堆复杂 sql,有些人自认为自己 sql 编写能力强,什么业务都喜欢一条长 sql 搞定,上百行的 sql 后面维护者看着想死
|
65
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,脉脉都有这样的场景,至于它们怎么实现就不知道)。另外,比如,常见的物流路线跟踪之类,非常实用。 |
66
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 这种服务器。 |
67
hantsy 2020-06-28 13:18:16 +08:00
|
68
hantsy 2020-06-28 13:30:27 +08:00
对于互联网数据这个处理,我想到三国那句话。天下大势,合久必分,分久必合。开发的时候尽可以业务细化,分而治之,化繁为简。产品上线根据需求,将一些数据聚合呈现。
|
69
chaos3 2020-06-28 16:00:13 +08:00
这些不都是模版模式调用 数据库吗。就好像微信支付和支付宝支付哪个能更简单买东西的问题一样。看项目的喜好和选择吧。本质没啥不一样啊。
|
70
mysunshinedreams 2020-06-28 17:09:32 +08:00
@felixin JOOQ 前期配置有点啰嗦。
|
71
Saurichthys 2020-06-28 17:14:09 +08:00
用 nutz 项目上 95%可以不用 sql,5%复杂语句,可以考虑用视图或者是自定义 sql 语句
|
72
limuyan44 2020-06-29 00:17:13 +08:00 via Android
楼里谈论这么多其实没啥用,在中国,肯定是 mybatis 用的最多的。至于为什么选 mybatis,也许是这些人不混 v 站。
|
73
Alex5467 2020-06-29 09:27:31 +08:00
使用 SpringBoot 你完全可以不用 xml 写 sql,用注解就可以搞定。
|
74
Alex5467 2020-06-29 09:29:26 +08:00
实际项目中用什么取决于项目复杂度吧,用 jpa 能解决复杂的关联查询吗。
|
75
Alex5467 2020-06-29 09:31:26 +08:00
@wjup 看国外网站统计的也有一部分人用 JdbcTemplate,mybatis 只占 20%,jpa 占大多数,很好奇复杂的 sql 他们怎么写的
|
78
wjup 2020-06-29 12:19:19 +08:00 via Android
@Alex5467 jdbcTemplate 有个不好的地方,返回 Map 对象时,如果查询数据为空就会报错😂😂
|
79
ltfree 2020-06-29 15:05:58 +08:00
mybatis xml 70% 80%公司都是这么干的,习惯就好了
|
81
hantsy 2020-06-30 14:22:02 +08:00
@liuzhen 另:Spring Data 简单的直接映射(属性名一致,取字段子集)可以在 Repository 中返回 Dto 就可以了。
interface UserRepostiory<>{ UserDto findByUsername() } |
82
CantSee 2020-06-30 15:41:20 +08:00
我觉得 mybatis 比较灵活,jpa 也还可以,但是复杂的查询会看来很难受,写 sql 比较清晰
|
83
halk 2020-06-30 18:26:31 +08:00
```java
User user = mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, 10086)); ``` 打算把项目里的 tk mapper 全部换成 mybatis-plus,也比 jpa 好用 |