MyBatis 与 Spring Data JPA 选择谁?

2016-06-12 12:29:16 +08:00
 acrisliu
公司项目准备重构,目前在持久层框架选择上有 MyBatis 和 Spring Data JPA 两个选择, MyBatis 应用比较广泛,但是写映射文件比较繁琐。 Spring Data JPA 用起来比较简单,而且与 Spring Boot 整合起来很好用,但是 Google 了一下相关资料比较少,不知道与 MyBatis 相比优缺点如何。

个人偏向于 Spring Data JPA ,有没有用过的老司机说说有没有坑?
32946 次点击
所在节点    Java
33 条回复
qa52666
2016-06-12 12:32:50 +08:00
推荐 MyBatis
acrisliu
2016-06-12 12:35:27 +08:00
@qa52666 能说下理由么,谢谢哈
hujianxin
2016-06-12 12:43:23 +08:00
spring data jpa 看着真的不错,但是就是资料较少,如果有能力的话,我还是推荐 spring data jpa ,这样的话一致性好,都是 spring 的子项目,心里舒服。嘿嘿嘿
letitbesqzr
2016-06-12 12:44:00 +08:00
spring boot jpa
brucefeng
2016-06-12 12:48:15 +08:00
用你们最熟悉的技术,如果团队对两个都熟悉,就对比下两个的优缺点,看看哪个最能接受;如果团队都不熟悉,那就找学习成本较低,资料更多的那个。
tedd
2016-06-12 12:52:14 +08:00
Jooq?
pelloz
2016-06-12 12:58:13 +08:00
看团队对技术的熟悉与接收程度罗,我不熟悉 Spring Data JPA ,但是 MyBatis 的映射文件不都应该是使用工具自动生成的吗?我现在的公司根据项目需要自己实现了一个 CodeGenerator ,一般的代码模板都是能够自动生成的,需要手写的部分比较少。而且我觉得 MyBatis 特别灵活,我蛮喜欢的。
odirus
2016-06-12 13:02:59 +08:00
@pelloz 我用 MyBatis 没多久,还不知道怎么做更加合适,不知道自动生成该如何做合适,都是手写的。

如果阔以的话,是否可以简单分享一下 MyBatis 的灵活之处
gy911201
2016-06-12 13:13:38 +08:00
spring data jpa 底层就是封装的 hibernate ,整体算是比较简单的项目,其实最后就是 Hibernate vs MyBatis 的选择了
pelloz
2016-06-12 13:14:40 +08:00
@odirus 网上应该有现成的 MyBatis Generator ,我没用过,大概是这个? https://github.com/mybatis/generator

灵活嘛,我觉得可以直接控制到动态的 sql 语句而且类型转换都已经帮我们封装好了,已经很好用了。而且,如果你上网找找,还能发现有人写了热加载的插件,我自己也照网上的实现自己封装了一下日常使用,可以做到调试程序的时候直接修改 mapper 文件不需要重启项目。
odirus
2016-06-12 13:16:17 +08:00
@pelloz 还有这么多 NB 特性哇,谢谢。

仔细拜读之
hantsy
2016-06-12 13:29:25 +08:00
Data JPA 用了好几年了。
letitbesqzr
2016-06-12 13:30:19 +08:00
@gy911201 是封装的 jpa ... hibernate 只是有提供 hibernate-entitymanager 来实现 jpa 而已...

spring data jpa 其实只用用他们提供的 Specification 转 jpa 2.0 的 Predicate 以及提供的分页排序方法就行了 . 关于他提供的什么 query 注解 还有 什么通过接口函数命令的方式来查询 感觉太鸡肋了.
. 特别是关系复杂的系统里.. 关联的表特别多.. jpa 这种就很方便了..

就比如以下这个查询..用 mybatis 写 需要写多少 sql ? 如果还要加上 分页 排序 ?

(gist 似乎抽了,打不开,直接贴代码)

```
@Override
public List<Program> getProgramsByGroup(Collection<Group> groups, Dept dept, Collection<Level> levels) {
Set<String> strGroups = groups.stream().map(Group::getId).collect(Collectors.toSet());
return super.findAll((root, query, cb) -> {
List<Predicate> levelPredicate = Lists.newArrayList();
levels.forEach(level -> {
levelPredicate.add(cb.equal(root.get(Program_.level), level));
});
return cb.and(
root.join(Program_.groups).get(Group_.id).in(strGroups),
cb.equal(root.join(Program_.dept).get(Dept_.id), dept.getId()),
cb.or(levelPredicate.stream().toArray(Predicate[]::new))
);
});
}
```
hantsy
2016-06-12 13:35:25 +08:00
Data JPA 对 JPA 2 中的 Criteria API 和 QueryDSL 作为简单的封装,不用再写 SQL 、 HQL , JPQL 了。

在过去的一些项目中, Type Safe 几乎是硬性要求,基于 String 的查询语句是绝对不允许的。另外一种选择是 JOOQ 。
hantsy
2016-06-12 13:43:41 +08:00
@acrisliu Data JPA 的一些用法可以看看这个,好几年前写的(主要对 Spring3 ):

https://github.com/hantsy/spring-sandbox/wiki/spring-data-jpa

有点老了,代码可以参考 Spring 4 版本(原来的 Spring 3 代码已经全部更新,删除了 XML 配置):

https://github.com/hantsy/spring-sandbox/
zacard
2016-06-12 13:45:16 +08:00
既然是重构了,想必规模不小了。还是使用 mybatis 吧。
写映射文件麻烦?: https://github.com/mybatis/generator
spring-boot 整合麻烦?: https://github.com/mybatis/spring-boot-starter
beneo
2016-06-12 13:45:43 +08:00
hibernate
hantsy
2016-06-12 13:46:09 +08:00
qa52666
2016-06-12 13:47:09 +08:00
推荐: MyBatis ,原因有两个。

1 、 MyBatis 的映射关系等,分页,插入成功后返回主键 ID 等,都是可以通过 MyBatis Generator 插件生成的。
![图 2.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf93952afd.jpg)
![图 3.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf9395d5a5.jpg)

2 、 MyBatis 可以自由书写 SQL 语句,发挥 sql 技巧。
比如下图:
![图 1.jpg]( https://ooo.0o0.ooo/2016/06/12/575cf814d236d.jpg)
hcymk2
2016-06-12 13:51:42 +08:00
如果是面向 SQL 编程(通过复杂的 SQL 查询解决问题),我觉得还是用 MyBatis.

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

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

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

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

© 2021 V2EX