经常看到有小伙伴在讨论 JPA 和 MyBatis 这两个孰优孰劣的问题,其实松哥觉得这是一个伪命题,没必要为这种问题争个面红耳赤,每种框架有它存在的道理,也有各自擅长的事情,今天松哥就和大家来聊聊这两个框架,顺便来了解一下大家在开发中都用的是哪一个数据库框架?
以下内容,松哥尽量保持一个客观中立立场,大家不要喷我,说的不完善的地方大家可以留言补充。
JPA
JPA是什么
Java Persistence API:用于对象持久化的 API
Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层
JPA和Hibernate的关系
JPA 是 Hibernate 的一个抽象(就像JDBC和JDBC驱动的关系);
JPA 是规范:JPA 本质上就是一种 ORM 规范,不是ORM 框架,这是因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现;
Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现
从功能上来说, 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的优势
标准化: 提供相同的 API,这保证了基于JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。
简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注解;JPA 的框架和接口也都非常简单。
可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
支持面向对象的高级特性: JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型
....
JPA包含的技术
ORM 映射元数据:JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。
查询语言(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 优势
上手容易,也更加容易掌握。
由于自己掌握 SQL ,因此可以写出更加优质的 SQL ,提高 SQL 的执行效率。
多表关联查询时,MyBatis 要灵活一些,也更具备优势。
.....
怎么用
关于这两个框架的用法,松哥在公众号都写过专门的文章介绍,读者可以翻一下历史记录,三年前还在 CSDN 写过一个 MyBatis 专栏,有兴趣的小伙伴可以去松哥专栏看看。
你用哪个
最后松哥来做一个小小的调查,看看大家在开发中用的哪个?
大家也可以留言说说自己项目中用了哪一个数据持久化框架,出于什么样的考虑用了该框架?
关注牧码小子,后台回复 Java ,领取松哥为你精心准备的Java干货!往期文章一览
1、工作之余,你是怎么提高技术的?
2、两年了,我写了这些干货!
3、想和大家谈一点合作
4、一个Java程序猿眼中的前后端分离以及Vue.js入门
5、跟着平台混了四年,现在要单飞了!
你点的每个在看,我都认真当成了喜欢