Java 持久层——JDBC,MyBatis,ORM与JPA

1. JDBC(Java DataBase Connectivity)

JDBC是Java提供的一个操作数据库的API。它是由各种数据库厂商提供类和接口组成的数据库驱动,为多种数据库提供统一访问。我们使用数据库时只需要调用JDBC接口就行了。


JDBC访问数据库的主要工作:
1.得到JDBC驱动程序
2.使用DriverManager,Connection,Statement,ResulrSet等;

public class JDBC {
    public static void main(String[] args) {
        // 定义连接对象
        Connection connection = null;
        // 定义预编译语句对象
        PreparedStatement preparedStatement = null;
        // 定义结果集对象
        ResultSet resultSet = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过数据库驱动获取数据库连接
            connection = DriverManager.
                    getConnection("jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8", "root", "root");
            // 定义并初始化SQL语句
            String sql = "select * from user where id = ?";
            // 创建预编译语句对象
            preparedStatement = connection.prepareStatement(sql);
            // 设置查询参数
            preparedStatement.setString(1, "1");
            // 向数据库发出SQL并执行查询,获取查询结果集.
            resultSet = preparedStatement.executeQuery();
            // 遍历查询结果集
            while (resultSet.next()) {
                // 输出查询结果
                System.out.println("id = " + resultSet.getString("id"));
                System.out.println("name = " + resultSet.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally { // 释放资源
            if (resultSet != null) {
                try {
                    // 关闭结果集对象
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    // 关闭预编译语句对象
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    // 关闭连接对象
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDBC的几个缺点:

1)频繁地开启和关闭数据库连接,严重地影响了数据库的性能。
2)代码中存在硬编码。每当需求变更时,都需要修改源代码然后重新编译,系统不易维护。
3)设置查询参数的过程繁琐。
4)获取查询结果的过程繁琐。


2.Java 持久层框架


Java 持久层框架(底层是对JDBC的封装)访问数据库的方式大致分为两种:
1)以 SQL 核心,封装一定程度的 JDBC 操作,比如: MyBatis。
2)以 Java 实体类为核心,将实体类的和数据库表之间建立映射关系,也就是我们说的ORM框架,如:Hibernate、Spring Data JPA。

MyBatis不是ORM框架,MyBatis只是将数据库中的内容映射为实体。没有将实体映射为数据库中的字段


3. MyBatis

MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建连接、创建执行语句、手动设置参数和结果集检索等繁杂的过程。MyBatis中,封装了一个sqlsession 对象(里面封装有connection对象),由此对象来对数据库进行CRUD操作。

MyBatis对JDBC操作数据库做了一系列的优化:
(1) mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。
(2) mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。
(3) mybatis 提供了一级和二级缓存,提高了程序性能。
(4) mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置)
(5) mybatis对数据库操作结果进行自动映射


4. ORM与JPA概述

1). ORM简介

Object-Relational Mapping: 对象关系映射,ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。使用ORM则会大大减少重复性代码

ORM的优点:
ORM最大的优势,隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

ORM的缺点:
(1) 性能较低。无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
(2)对多表查询力不从心。


2). JPA介绍

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA规范本质上就是一种ORM规范,JPA并未提供ORM实现。它只是制订了一些规范,仅仅提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。JPA框架底层都是ORM思想,其框架具有ORM全部的优缺点。JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate是一种JPA实现。

JPA为我们提供了以下规范:

  1. ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
    如:@Entity、@Table、@Column、@Transient等注解。
  2. JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发人员不用再写SQL了
    entityManager.merge(T t);
  3. JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
    如:from Student s where s.name = ?

JPA当问数据库主要工作
1.得到JDBC驱动程序
2.得到持久性提供者相关类库和配置文件
3.提供实体类
4.使用Persistence、EntityManagerFactory和Entity等接口。


3). 常用的JPA框架

目前常用的JPA框架有:
Hibernate(JBoos开源)
Open JPA(apache开源)
Toplink

(1)Hibernate

Hibernate是Java中的对象关系映射解决方案。对象关系映射或ORM框架是将应用程序数据模型对象映射到关系数据库表的技术。Hibernate 不仅关注于从 Java 类到数据库表的映射,也有 Java 数据类型到 SQL 数据类型的映射。

(2)Spring Data JPA

Spring Data是Spring 社区的一个子项目,主要用于简化数据(关系型&非关系型)访问,其主要目标是使得数据库的访问变得方便快捷。
• 它提供很多模板操作
– Spring Data Elasticsearch
– Spring Data MongoDB
– Spring Data Redis
– Spring Data Solr
• 强大的 Repository 和定制的数据储存对象的抽象映射
• 对数据访问对象的支持

Spring Data JPA
Spring Data JPA不是JPA提供者。它是一个库/框架,它在我们的JPA提供程序(如Hibernate)的顶部添加了一个额外的抽象层。虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换仍然需要编写不同的代码,而使用Spring Data JPA能够方便大家在不同的ORM框架之间进行切换而不需要更改代码。Spring Data JPA旨在通过将统一ORM框架的访问持久层的操作,来提高开发人的效率。

Spring Data JPA给我们提供的主要的类和接口:Repository 接口,Repository 实现类。以上这些类和接口就是我们在使用Spring Data JPA的时候需要掌握的。

总结就是:

• Hibernate是JPA的一种实现,是一个框架
• Spring Data JPA是一种JPA的抽象层,底层依赖Hibernate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章