jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别

jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别

转载声明

本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容

1 jdbc(Java DataBase Connectivity

1.1 概述

JDBC 是java连接数据库操作的原生接口。

JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。

作为API,JDBC为程序开发提供标准的接口,并为各个数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。一句话概括:jdbc是所有框架操作数据库的必须要用的,由数据库厂商提供,但是为了方便java程序员调用各个数据库,各个数据库厂商都要实现jdbc接口。
在这里插入图片描述

1.2 示例

概念阐述的可能稍微有点抽象,说的直白点可以这么理解:各个产商的DB产品很多,JAVA联合各个DB产商定了个规范,JAVA可以按照规范去编写代码,就可以用相同的操作方法去操作不同产商的DB了。也就是说JDBC是JAVA与各个DB产商之间的一个约定规范、约束的是DB产商的实现规范。

基于JDBC,我们可以在JAVA代码中去执行DB操作,如下示意:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@SuppressWarnings("all")   // 注解警告信息
public class JdbcTest01 {
    public static void main(String[] args) throws Exception {
        // 1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2 创建和数据库之间的连接
        String username = "testdb";
        String password = "testxxxxxx";
        String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url,username,password);
        // 3.准备发送SQL
        String sql = "select * from t_person";
        PreparedStatement pstm = conn.prepareStatement(sql);
        // 4.执行SQL,接收结果集
        ResultSet rs = pstm.executeQuery();
        // 5 处理结果集
        while(rs.next()){
            int personId1 = rs.getInt("person_id");
            String personName1 = rs.getString("person_name");
            int age1 = rs.getInt("age");
            String sex1 = rs.getString("sex");
            String mobile1 = rs.getString("mobile");
            String address1 = rs.getString("address");
            System.out.println("personId="+personId1+",personName="+personName1
                    +",age="+age1+",sex="+sex1+",mobile="+mobile1+",address="+address1);
        }
        // 6.释放资源
        rs.close();
        pstm.close();
        conn.close();
    }
}

1.3 JDBC关键环节

  1. DriverManager根据使用的DB类型不同,加载对应的JDBC Driver
  2. 特定的JDBC Driver连接DB
  3. 客户端编写SQL语句
  4. 发送到DB中执行,并接收结果返回
  5. 对结果进行处理解析
  6. 释放过程中的连接资源

1.4 JDBC弊端

从演示代码里面,还可以看出,直接基于JDBC进行操作DB的时候,其弊端还是比较明显的:

业务代码里面耦合了字符串格式SQL语句,复杂场景维护起来比较麻烦;
非结构化的key-value映射方式处理结果,操作过于复杂,且不符合JAVA面向对象的思想;
需要关注过程资源的释放、操作不当容易造成泄露。
也正是由于JDBC上述比较明显的弊端,纯基于JDBC操作DB一般仅用于一些小型简单的场景,正式大型项目中,往往很少有直接基于JDBC进行编码开发的,而是借助一些封装框架来实现。

1.5 spring data JDBC

spring data JDBC相比传统JDBC而言省去了 数据库驱动,连接等无关配置,只需要写sql,设置参数;

2 ORM

2.1 概述

ORM (Object Relation Mapping,对象关系映射)是一种思想,是插入在应用程序与JDBC API之间的一个中间层,用于在关系型数据库和业务实体对象之间作一个映射.

  • Object可以理解成java实体类Entity
  • Relation是关系型数据库中的二维表
  • Mapping是java对象到数据库表记录的映射;

JDBC并不能很好地支持面向对象的程序设计,ORM解决了这个问题。

ORM框架中贯穿着JAVA面向对象编程的思想,是面向对象编程的优秀代言人。直白点说,ORM就是将代码里面的JAVA类与DB中的table表进行映射,代码中对相关JAVA类的操作,即体现为DB中对相关Table的操作,简化了JAVA开发人员的编码复杂度。

3 JPA

3.1 概述

JPA 的全称是 Java Persistence API,中文的字面意思就是 java 的持久层 API ,jpa 就是定义了一系列标准,让实体类和数据库中的表建立一个对应的关系,当我们在使用 java 操作实体类的时候能达到操作数据库中表的效果(不用写sql ,就可以达到效果),jpa 的实现思想即是 ORM。这个并非是一个新的概念,其实在JDK5.x版本中就已经引入的一个概念。其宗旨是为 POJO 提供一个基于 ORM 的持久化操作的标准规范。

jpa 并不是一个框架,是一种java持久化规范,是orm框架的标准,主流orm框架都实现了这个标准,持久层框架 Hibernate 是 jpa 的一个具体实现, spring data jpa 又是在 Hibernate 的基础之上的封装实现。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。ORM是一种思想,是插入在应用程序与JDBC API之间的一个中间层,JDBC并不能很好地支持面向对象的程序设计。ORM解决了这个问题,通过JPA将字段高效的与对象进行映射。具体实现有hibernate、spring data jpa、open jpa。

JPA 仅仅是一种规范,也就是说 JPA 仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而 Hibernate 就是实现了 JPA 接口的 ORM 框架。JPA的具体解决方案不止hibernate一种,还有TopLink、JDO、open等,可以简单理解成JPA是接口,Hibernate是实现类;

在这里插入图片描述

但其实,因为没有好的解决方案,而hibernate是第三方的,所以sun在有了具体解决方案后提出一种标准即为JPA,实际是sun的EJB斗不过spring的结果.

3.2 JPA主要构成

  • 一套标准API
    在javax.persistence的包下面提供,用来操作实体对象,执行CRUD操作,将开发者从烦琐的JDBC和SQL代码中解脱出来,按照JAVA面向对象思路去编写代码操作DB。
  • JPQL面向对象操作语言
    通过面向对象的思路,避免代码与SQL的深度耦合,大大提高开发效率。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
  • ORM元数据映射
    ORM,即Object Relation Mapping,对象关系映射。JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

3.3 详解

  • ORM 映射元数据:JPA 支持 XML 和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
    如:@Entity、@Table、@Column、@Transient 等注解。

  • JPA 的 API:用来操作实体对象,执行 CRUD 操作,框架在后台替我们完成所有的事情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。
    如:entityManager.merge (T t);

  • JPQL 查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的 SQL 语句紧密耦合。
    如:from Student s where s.name = ?

4 Hibernate

详见Hibernate学习

Hibernate是一个标准的ORM框架,实现Jpa接口。Hibernate着手解决如何实现映射的方案,是一种处理映射关系方法类框架。

JPA和Hibernate 的关系就像JDBC和JDBC 驱动的关系:JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。
在这里插入图片描述
Hibernate 不仅关注于从 Java 类到数据库表的映射,也有 Java 数据类型到 SQL 数据类型的映射。

5 Spring Data JPA

5.1 概述

SpringData是Spring 社区的一个子项目,主要用于简化数据(关系型&非关系型)访问,其主要目标是使得数据库的访问变得方便快捷。

特点:

  • 它提供很多模板操作
    • Spring Data Elasticsearch
    • Spring Data MongoDB
    • Spring Data Redis
    • Spring Data Solr
  • 强大的 Repository 和定制的数据储存对象的抽象映射
  • 对数据访问对象的支持

解决的问题
虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换仍然需要编写不同的代码。Spring Data JPA是在实现了JPA规范的基础上封装的一套 JPA 应用框架,使用SpringData JPA能够方便大家在不同的ORM框架之间进行切换而不要更改代码。Spring Data JPA旨在通过将统一ORM框架的访问持久层的操作,来提高开发人的效率。
在这里插入图片描述

  • Spring Data JPA是对JPA规范的再次抽象,是基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,底层默认还是用的实现JPA的Hibernate技术,也可以使用其他技术实现。

  • Spring Data JPA可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!他是强大的Spring Data系列的一部分,可以轻松实现基于JPA的存储库,此模块处理对基于JPA的数据访问层的增强支持,它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。学习并使用 Spring Data JPA 可以极大提高开发效率。

  • 具体来说,他是spring对jpa的更高层次的抽离,也是一种规范,需要具体实现,如hibernate,不过在此基础上又实现了一些功能,比如可以根据dao接口中的方法名智能实现dao的实现,所有你只需要写dao接口,不需要写实现,不过方法名必须符合规则

  • jpa 是规范;hibernate实现了这个规范;spring data jpa对hibernate进行了封装。
    在这里插入图片描述

5.2 详解

5.2.1 特点

spirng data jpa 是 spring 提供的一套简化 JPA 开发的框架,按照约定好的【方法命名规则】写 dao 层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了 CRUD 之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA不是一个完整JPA规范的实现,它只是一个代码抽象层,主要用于减少为各种持久层存储实现数据访问层所需的代码量。其底层依旧是 Hibernate 。

可以把 Spring Data JPA 理解为 JPA 规范的再次封装抽象。

5.2.2 优势

5.2.2.1 开发简单

一张用户表(UserEntity),信息如下:
在这里插入图片描述

Java代码实现如下需求:

// 获取DevDept部门的所有用户:
List<UserEntity> users = userReposity.findAllByDepartment("DevDept");
// 获取DevDept部门的Admin角色的所有用户:
List<UserEntity> users = userReposity.findAllByDepartmentAndRole("DevDept", "Admin");

看完上面的例子,一个最直观的感受是什么?

简单!

没错,“简单”就是Spring Data JPA最大的优势!

对于大部分的常规操作,基于Spring Data JPA,开发人员可以更加专注于业务逻辑的开发,而不用花费太多的精力去关注DB层面的封装处理以及SQL的编写维护,甚至在DAO层都不需要去定义接口。

5.2.2.2 与具体DB SQL解耦,可移植性较好

除了简化开发,JPA还有的另一个比较大的优势,就是其可移植性比较好,因为其通过JPQL的方式进行操作,与原生SQL之间几乎没有耦合,所以可以方便的将底层DB切换到别的类型。

5.2.3 整体实现逻辑

在这里插入图片描述

  1. JAVA业务层调用SpringData JPA二次封装提供的Repository层接口
  2. 代理调用实际的视线
  3. 接着基于JDBC标准API接口
  4. 调用基于Hibernate提供的JPA具体实现
  5. 调用JDBC基础API,SQL绑定
  6. JDBC Driver执行请求,完成与实际DB之间的请求交互。

5.3 接口约定命名规则

在这里插入图片描述
实例:
在这里插入图片描述

5.4 SpringBoot 集成 spring data jpa

  1. 导入 maven 坐标
    在这里插入图片描述
  2. yml 配置文件中配置数据源信息、 jpa 信息
    在这里插入图片描述

5.5 主要的类和接口

Repository

CrudRepository

JpaRepository

Repository 实现类:

SimpleJpaRepository

QueryDslJpaRepository

6 Mybatis

详见Mybatis-好文推荐

Mybatis也是一个持久化框架,但不完全是一个ORM框架,不是依照的JPA规范。

优势:

  • 它支持定制化SQL、存储过程以及高级映射。
  • MyBatis 避免了几乎全部的JDBC代码和手动设置参数以及获取结果集。
  • MyBatis可使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

7 FAQ

7.1 JDBC,ORM,JPA,Spring Data JPA之间到底啥关系

在这里插入图片描述

  • JDBC
    是JAVA操作最终数据库的底层接口,JDBC是与各个DB产商之间约定的协议规范,基于这些规范,可在JAVA代码中往DB执行SQL操作。
  • JDBC问题
    因为JDBC负责将SQL语句执行到DB中,属于相对原始的接口,业务代码里面需要构建拼接出SQL语句,然后基于JDBC去DB中执行对应SQL语句。这样存在的问题会比较明显,JAVA代码中需要耦合大量的SQL语句、且因为缺少封装,实际业务编码使用时会比较繁琐、维护复杂。
  • ORM
    为了能够将代码与SQL语句分离开,以一种更符合JAVA面向对象编程思维的方式来操作DB,诞生了ORM(Object Relation Mapping, 对象关系映射)概念,ORM将JAVA的Object与DB中的Table进行映射起来,管理Object也等同于对Table的管理与操作,这样就可以实现没有SQL的情况下实现对DB的操作。常见的ORM框架有 Hibernate 、 EclipseLink 、 OpenJPA 等等。
  • JPA
    为了规范ORM的具体使用,JAVA 5.x开始制定了基于ORM思想的Java持久化层操作API规范,也即JPA(注意,JPA只是一个基于ORM思想的JAVA API规范,供各个ORM框架提供API时遵循),当前主流ORM框架都是支持JPA规范的。
  • Spring Data JPA
    Spring框架盛行的时代,为了能够更好适配,Spring Data JPA诞生, 这个可以理解为对JPA规范的二次封装(可以这么理解:Spring Data JPA不是一个完整JPA规范的实现,它只是一个代码抽象层,主要用于减少为各种持久层存储实现数据访问层所需的代码量),其底层使用的依旧是常规ORM框架(Hibernate)。

7.2 JPA、Hibernate、SpringData JPA关系

  • JPA(Java Persistence API)是规范,它指明了持久化、读取和管理 Java 对象映射到数据库表时的规范。
  • Hibernate 则是一个 ORM 框架,它实现了 Java 对象到数据库表的映射。也就是说,Hibernate 提供了 JPA 的一种实现。
  • Spring Data JPA 是 Spring Framework 的一部分。它不是 JPA 的实现,而是在 JPA 之上提供更高层次的抽象,可以减少很多模板代码。
    而 Spring Data JAP 的默认实现是 Hibernate,当然也可以其他的 JPA Provider。

7.3 Spring Data JPA和MyBatis如何抉择

提到JPA, 那么MyBatis绝对是无法回避的一个内容。的确,作为JAVA持久化层的优秀框架,MyBatis甚至是很多开发人员在项目构建初期脑海中唯一的选型方案。那么,JPA想要从MyBatis占领地中分一杯羹,究竟是具有哪方面的优势呢?

  • MyBatis优势

    • 可以灵活编写复杂sql语句
    • 避免了几乎全部的JDBC代码和手动设置参数以及获取结果集,相比JDBC更方便
  • MyBatis与JPA的差异点:

    • 设计哲学不同,MyBatis偏向于面向过程,JPA则将面向对象发挥到极致;
    • 使用场景
      MyBatis定制起来更加灵活,支持高度定制化的sql语句,支持任意编写sql语句;而JPA相对更注重对已有高频简单操作场景的封装,简化开发人员的重复操作,虽然JPA也支持定制SQL语句,但是相比MyBatis灵活度略差。

至此,到底如何在JPA与MyBatis之间抉择,就比较清晰了:

  • JPA适用于简单、固定场景
    如果你的系统中对DB的操作没有太多额外的深度定制、对DB的执行性能也不是极度敏感、不需要基于SQL语句做一些深度的优化,大部分场景都是一些基础CRUD操作,则无疑Spring Data JPA是比较理想的选择,它将大大降低开发人员在DB操作层面的投入精力。
  • Mybatis适用于复杂或性能敏感场景
    如果你的业务中对DB高阶逻辑依赖太深,比如大部分场景都需要额外定制复杂SQL语句来实现,或者系统对性能及其敏感,需要基于Table甚至column维度进行深度优化,或者数据量特别巨大的场景,则相比较而言,MyBatis提供的调优定制灵活性上要更有优势一些。

综上分析,其实MyBatis与Spring Data JPA其实没有一个绝对的维度来评价谁更优一些,具体需要结合自身的实际诉求来选择。

更多好文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值