在开发者的圈子里,没当说到一种技术好或者不好,都会引发激烈或者不激烈的争论,直到一个开发者出来说 PHP 是世界上最好的语言,大家伙儿才会纷纷退去继续写代码。

今天说 JPA 的问题不是想引发什么讨论或者骂战,单纯的就是我不喜欢 JPA 。没错,就是这么 Real。

说到 Java 开发,涉及到数据库访问的,主要就两种框架,一个是 MyBatis ,另一个就是 JPA。据说是国外 JPA 用的比较多,国内 MyBatis 用的比较多。国内为什么 MyBatis 用的多呢,传说是因为整个阿里系都用它。

JPA 全称是Java 持久化 API ,它的目的就是帮助我们提高开发效率,它的核心是 Java持久化查询语言 (JPQL),对存储在关系数据库中的实体进行查询。在语法上类似于SQL查询,但是操作的是实体对象而不是直接对数据库表进行操作。(摘自 wiki)

使用 JPA 开发的流程如下:

1、将数据库表映射到项目实体中

2、生成对应的 Repository

3、实现 Service ,Service 中调用 Repository

JPA 帮你省事儿的地方就在 Repository 里,对于那些比较简单的逻辑,比如单表查询,直接根据名字就可以实现查询逻辑。对于大部分查询来说,真的很省事儿。但刚开始用的时候,确实感觉有些莫名其妙。

确实如此,如果你用过 JPA ,有些时候它确实对开发效率有很大提升,JPA 想要做的就是尽量让你少写 sql,甚至不写 sql。基于这种思想,JPA 实现了它自己的一套语法、注解规则。

JPA 要用各种注解配合来实现数据实体间的一对多、多对多等等的关联关系。正因为这样,我觉得实体变得不单纯是实体,而是掺杂的逻辑在里面,也增加了实体的复杂度,对于比较复杂的业务来说,很容易造成实体间直接或间接的循环引用。

你如果想用 JPA,除了要掌握各种注解外,对于稍微复杂的查询,还要掌握它的那套写法,比如下面这种代码:

	Specification<CmContent> specification = (root, criteriaQuery, criteriaBuilder) -> {
Predicate p = criteriaBuilder.equal(root.get("deleted").as(Boolean.class), false);
Predicate news = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_NEWS.name());
Predicate salon = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_SALON.name());
Predicate type = criteriaBuilder.or(news, salon);
...

而且你想要实现一个 join 查询也是够费劲的,除了要写上面那套代码外,还要在实体上做手脚,想到就想哭,有没有。难道直接写个 sql 不好吗,为什么要这么糟蹋自己。

还有一点,JPA 有些注解用上了之后会影响到数据库层面,比方说关键外键的注解,如果你用默认设置,这个外键就真的会应用到数据库表里,在表上建外键。还有其他的一些 ORM 框架也是如此,这是我完全不能接受的,凭什么,凭什么在我的数据库上改东西。

愿我参与的项目中没有 JPA。公司有个项目用到了 JPA ,我也参与了一部分,写的代码不算多,除了令我头疼之外,没有体会到 JPA 的半点好处,这其中当然很可能是由于我的水平有限,或者说我写的 JPA 代码不够多,或者我根本没有领会到 JPA 的精髓所在。总之不管怎么样,对不起,愿我不会再碰到 JPA。

当然这么说肯定是有失偏颇,有些同学可能会对此嗤之以鼻。没错,有同事就是这样说的:事物存在即合理,JPA 这么多年了,如果不好用怎么会还有这么多人用,而且国外 JPA 使用者众多,难道人家都有问题。

如果只是简单的项目,业务一点也不复杂,不复杂到连个 join 都没有的项目,可以用 JPA ,其他的情况下,真的不用它最好。用 JPA 的感觉就像是被绑上了手脚,失去了自由。不自由,毋宁死。纵使千般好,少了自由,我就拒绝它。而 MyBatis 恰恰就是给开发者自由的一个框架。

还是那句话,不自由,毋宁死。这是第一个,恐怕也是最后一个用 JPA 的项目了。

不要吝惜你的「推荐」呦

欢迎关注,不定期更新本系列和其他文章

古时的风筝 ,进入公众号可以加入交流群

我真的不想再用 JPA 了的更多相关文章

  1. 【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

    写在前面 最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者朋友面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒 ...

  2. python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)

    day13 --------------------------------------------------------------- 实例021:猴子偷桃 题目 猴子吃桃问题:猴子第一天摘下若干 ...

  3. 不想再做"鸟蛋"

    至今为止学习C++两个学期了,有过迷茫,有过自信,有过崩溃,有过希望,有过伤心,有过高兴.这一路走来,C++虐我千百遍,我待C++如"初恋".                    ...

  4. 数据库已有时间索引,想再添加ID索引

    将时间索引的代码复制进去后,将编辑框的变量改为m_QueryID. 准备先以时间索引查找出大概数据,再直接使用ID索引精确查找. 于是想直接精确查ID为105的数据信息. 出现错误: 发现错误原因是忘 ...

  5. 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码

    程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...

  6. 【Python3练习题 016】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

    这题得倒着推.第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第9天还没吃之前有桃子p个,可得:p * 1/2 - 1 = 1,可得 p = 4.以此类推,即可手算出. 代码思路为: ...

  7. 【Spring】只想用一篇文章记录@Value的使用,不想再找其它了(附思维导图)

    1 简介 不得不说,Spring为大家提供许多开箱即用的功能,@Value就是一个极其常用的功能,它能将配置信息注入到bean中去.即使是一个简单的功能,Spring也提供了丰富的注入类型和形式.我经 ...

  8. java 关于 重写、覆写、覆盖、重载 的总结【不想再傻傻分不清了】

    1.前言 有些东西,名称不同,其实就是一个东西,你说是扯淡不? 2.重写 重写,又叫覆写.覆盖 ,注解@Override,词义为推翻 , 用法特点是继承父类后,重写的父类方法名字.参数.返回值必须相同 ...

  9. 【木德木作杯楼市达人秀NO.28】南湖买房故事

    应得意版主的邀请,我也来写写我的买房故事,虽然过程没有别人那么惊心动魄,但是毕竟是自己人生中非常重要的一件事情,就像恋爱一样,情话永远没有情书好,我也借此纪念一下这段短暂的时光.其中会涉及到本人对一些 ...

随机推荐

  1. 搭建Springboot网站有感

    最近心血来潮,搭建了个人网站,一方面想学习下新的知识,另一方面也想有个作品,在这分享下自己的体会,先不说知识点. 建站容易吗,因人而异,而我在完成这个最最简单的工作时起码经历了3个阶段不同的心理变化, ...

  2. 【win】【qt5打包】【qt程序打包成一个可执行文件(带图标任何win都可以运行哦)】

    [前言] 业务需求将qt程序打包成win可执行文件.咱是做linux的,奈何用的麒麟系统,程序运行在win,好嘛,重新在win qtcreator编译后打包呗. [目标] 1.给qt程序添加一个图标. ...

  3. 201412-2 Z字形扫描(c语言)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  4. Python模块之pexpect

    一.pexpect模块介绍 Pexpect使Python成为控制其他应用程序的更好工具.可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,pass ...

  5. sqoop与PG库导入导出数据

    导入数据到Hive sqoop import --connect jdbc:postgresql://172.66.6.666/radar5g4h --username postgres --pass ...

  6. Vim高手,从来不用鼠标

    Vim脱离鼠标第一步 平时不可缺少的会用到vim,但是避免不了鼠标,事实上,省略鼠标是完全可以的,没有想像中那么难,看我短短几行带大家一起省略鼠标. 对了,vim有三种模式,基本模式就是用来输入命令的 ...

  7. .net core 单元测试之 JustMock第一篇

    前面介绍了单元测试的框架NUnit,它可以很好的帮助我们建立测试,检验我们的代码是否正确.但这还不够,有时候我们的业务比较重,会依赖其它的类.基于隔离测试的原则,我们不希望依赖的其它类影响到我们的测试 ...

  8. Spring MVC内置支持的4种内容协商方式【享学Spring MVC】

    每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...

  9. 如何运用PHP+REDIS解决负载均衡后的session共享问题

    一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的 ...

  10. JDBC之LOB数据类型

    JDBC之LOB数据类型 一.Oracle LOB LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据). LOB ...