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

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