经常看到有小伙伴在讨论 JPA 和 MyBatis 这两个孰优孰劣的问题,其实松哥觉得这是一个伪命题,没必要为这种问题争个面红耳赤,每种框架有它存在的道理,也有各自擅长的事情,今天松哥就和大家来聊聊这两个框架,顺便来了解一下大家在开发中都用的是哪一个数据库框架?

以下内容,松哥尽量保持一个客观中立立场,大家不要喷我,说的不完善的地方大家可以留言补充。

JPA

JPA是什么

  1. Java Persistence API:用于对象持久化的 API

  2. Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层 

JPA和Hibernate的关系

  1. JPA 是 Hibernate 的一个抽象(就像JDBC和JDBC驱动的关系);

  2. JPA 是规范:JPA 本质上就是一种 ORM 规范,不是ORM 框架,这是因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现;

  3. Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现

  4. 从功能上来说, JPA 是 Hibernate 功能的一个子集

JPA的供应商

JPA 的目标之一是制定一个可以由很多供应商实现的 API,Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现,JPA 供应商有很多,常见的有如下四种:
1.Hibernate
JPA 的始作俑者就是 Hibernate 的作者,Hibernate 从 3.2 开始兼容 JPA。
2.OpenJPA
OpenJPA 是 Apache 组织提供的开源项目。
3.TopLink
TopLink 以前需要收费,如今开源了。
4.EclipseLink

JPA的优势

  1. 标准化: 提供相同的 API,这保证了基于JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。

  2. 简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注解;JPA 的框架和接口也都非常简单。

  3. 可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。

  4. 支持面向对象的高级特性: JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型

  5. ....

JPA包含的技术

  1. ORM 映射元数据:JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

  2. JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。

  3. 查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL 紧密耦合。

MyBatis

什么是 MyBatis

MyBatis 也是一个 Java 持久化框架,它通过 XML 描述符或 Annotation 把对象与存储过程或SQL语句关联起来。与 JPA 这种对象关系映射(ORM)框架不同,MyBatis 并没有将 Java 对象与数据库表关联起来,而是将 Java 方法与 SQL 语句关联。MyBatis 允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性,其实 MyBatis 最吸引松哥的地方就是完全控制 SQL 的执行。

与 JDBC 相比,MyBatis 简化了查询结果映射:SQL 语句在一行代码中就能执行。MyBatis 提供了一个映射引擎,声明式的把 SQL 语句执行结果与对象树映射起来。通过使用一种内建的类 XML 表达式语言,或者使用 Apache Velocity 集成的插件,SQL 语句可以被动态的生成,这些特性都可以使开发者更方便的使用 MyBatis。MyBatis 也支持声明式数据缓存,当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库取得的所有数据会被存储在一段高速缓存中,今后执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。

MyBatis 优势

  1. 上手容易,也更加容易掌握。

  2. 由于自己掌握 SQL ,因此可以写出更加优质的 SQL ,提高 SQL 的执行效率。

  3. 多表关联查询时,MyBatis 要灵活一些,也更具备优势。

  4. .....

怎么用

关于这两个框架的用法,松哥在公众号都写过专门的文章介绍,读者可以翻一下历史记录,三年前还在 CSDN 写过一个 MyBatis 专栏,有兴趣的小伙伴可以去松哥专栏看看。

你用哪个

最后松哥来做一个小小的调查,看看大家在开发中用的哪个?

大家也可以留言说说自己项目中用了哪一个数据持久化框架,出于什么样的考虑用了该框架?

关注牧码小子,后台回复 Java ,领取松哥为你精心准备的Java干货!

往期文章一览

1、工作之余,你是怎么提高技术的?

2、两年了,我写了这些干货!

3、想和大家谈一点合作

4、一个Java程序猿眼中的前后端分离以及Vue.js入门

5、跟着平台混了四年,现在要单飞了!

你点的每个在看,我都认真当成了喜欢

jpa findone怎么用_Jpa VS MyBatis,你用哪个?相关推荐

  1. jpa mysql乐观锁_JPA @Lock(value = LockModeType.PESSIMISTIC_WRITE) 悲观锁防坑

    前提: 由于业务需要在entity Product已经实现了@version的乐观锁的基础上再加上了悲观锁的控制 @Lock(value = LockModeType.PESSIMISTIC_WRIT ...

  2. java jpa saveall方法优化_JPA批量插入(saveAll)

    有时候要从第三方导入数据,一般量都比较大,除了方法用异步线程@Async之外,如果每条记录都调用一次save显然对数据库压力很大.可以使用JPA的批量保存方法saveAll(Iterable enti ...

  3. jpa执行sql脚本_JPA persistence.xml SQL脚本定义

    jpa执行sql脚本 您可以在将在运行时执行的JPA持久性上下文定义中定义并链接到SQL脚本. 有标准化的属性来定义脚本,以分别说明如何创建模式,批量加载数据和删除模式: <persistenc ...

  4. jpa 实体图查询_JPA实体图

    jpa 实体图查询 JPA 2.1的最新功能之一是可以使用实体图指定获取计划. 这很有用,因为它允许您自定义使用查询或查找操作检索的数据. 在使用中大型应用程序时,通常以不同的方式显示来自同一实体的数 ...

  5. jpa 实体映射视图_JPA教程:实体映射-第2部分

    jpa 实体映射视图 在上一篇文章中,我展示了一种持久保存实体的简单方法. 我解释了JPA用于确定实体默认表的默认方法. 假设我们要覆盖此默认名称. 我们之所以喜欢这样做,是因为数据模型是以前设计和修 ...

  6. jpa 实体映射视图_JPA教程:实体映射-第3部分

    jpa 实体映射视图 在上一篇文章中,我展示了两种读取/写入持久实体状态的不同方法-字段和属性. 使用字段访问模式时,JPA使用反射直接从实体的字段读取状态值. 如果我们没有明确指定列名,它将直接将字 ...

  7. jpa 实体映射视图_JPA教程:映射实体–第1部分

    jpa 实体映射视图 在本文中,我将讨论JPA中的实体映射过程. 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 . 在前两篇文章中,我解释了如何在Java SE环境中设置JPA. ...

  8. jpa配置映射包_JPA – Hibernate –包级别的类型映射

    jpa配置映射包 当我们最终成熟到可以在JPA中使用某些自定义类型映射时,我们通常会停留在某些提供程序特定的解决方案上,因为JPA本身并未定义任何用于执行此操作的机制. 让我为您展示一个JPA提供程序 ...

  9. jpa 关系拥有方_JPA:确定关系的归属方

    jpa 关系拥有方 使用Java Persistence API(JPA)时,通常需要在两个实体之间创建关系. 这些关系是通过使用外键在数据模型(例如数据库)中定义的,而在我们的对象模型(例如Java ...

最新文章

  1. 【jsp】jsp的内置对象(部分)
  2. TiDB 在知乎万亿量级业务数据下的实践和挑战
  3. 【转】推荐给初级Java程序员的3本进阶书
  4. DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(二)
  5. 成功解决from scipy.linalg import _fblas ImportError: DLL load failed: 找不到指定的模块。
  6. python 对excel文件进行分词并进行词频统计_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  7. 岗位内推 | 阿里巴巴高德动态信息部招聘算法工程师(可实习)
  8. datetime插入数据_SQL项目_(一)数据源准备
  9. Linux 用户及用户组的基本管理
  10. 华为P40系列全家福亮相:DxO冠军宝座已预订
  11. python开发效率怎样_Python 的开发效率真的比 Java高吗?
  12. java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁
  13. i3wm i3status状态栏实时显示网速
  14. CAD制图初学入门:CAD软件中属性定义的相关应用
  15. CentOS 7.6镜像下载
  16. 利用STM32精确测量电压
  17. Safair浏览器 时间戳转化兼容性问题。
  18. 【深度学习】02-06-谈谈机器学习的原理(选修)-李宏毅老师2122深度学习课程笔记
  19. 【操作系统】操作系统的概念、功能和目标
  20. 什么是项目管理中的质量控制?

热门文章

  1. httpurlconnect设置中文参数_CNC机床参数的设置及报警解除,赶紧收藏吧!
  2. 【JAVA基础篇】面对对象的特征
  3. Java操作HBase
  4. 关于SQL2012里,出现“表中的数据受保护,不能修改”的情况的解决办法
  5. linux修改主机名后oracle em控制台起不来,更改计算机名后导致Oracle dbconsole无法启动问题解决方法...
  6. python集合去重_python集合去重
  7. python火柴人打架代码_python火柴人
  8. mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...
  9. python 教学_「Python基础」一次就装好Python手把手装到好
  10. python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)