Hibernate ORM 概覽

2021-09-09 17:49 更新

ORM 概覽

什么是 JDBC?

JDBC 代表 Java Database Connectivity ,它是提供了一組 Java API 來(lái)訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的 Java 程序。這些 Java APIs 可以使 Java 應(yīng)用程序執(zhí)行 SQL 語(yǔ)句,能夠與任何符合 SQL 規(guī)范的數(shù)據(jù)庫(kù)進(jìn)行交互。

JDBC 提供了一個(gè)靈活的框架來(lái)編寫操作數(shù)據(jù)庫(kù)的獨(dú)立的應(yīng)用程序,該程序能夠運(yùn)行在不同的平臺(tái)上且不需修改,能夠與不同的 DBMS 進(jìn)行交互。

JDBC 的優(yōu)點(diǎn)和缺點(diǎn)

JDBC 的優(yōu)點(diǎn) JDBC 的缺點(diǎn)
干凈整潔的 SQL 處理 大項(xiàng)目中使用很復(fù)雜
大數(shù)據(jù)下有良好的性能 很大的編程成本
對(duì)于小應(yīng)用非常好 沒有封裝
易學(xué)的簡(jiǎn)易語(yǔ)法 難以實(shí)現(xiàn) MVC 的概念
  查詢需要指定 DBMS

為什么是對(duì)象關(guān)系映射(ORM)?

當(dāng)我們工作在一個(gè)面向?qū)ο蟮南到y(tǒng)中時(shí),存在一個(gè)對(duì)象模型和關(guān)系數(shù)據(jù)庫(kù)不匹配的問(wèn)題。RDBMSs 用表格的形式存儲(chǔ)數(shù)據(jù),然而像 Java 或者 C# 這樣的面向?qū)ο蟮恼Z(yǔ)言它表示一個(gè)對(duì)象關(guān)聯(lián)圖。考慮下面的帶有構(gòu)造方法和公有方法的 Java 類:

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   public Employee() {}
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public String getFirstName() {
      return first_name;
   }
   public String getLastName() {
      return last_name;
   }
   public int getSalary() {
      return salary;
   }
}

現(xiàn)考慮以上的對(duì)象需要被存儲(chǔ)和索引進(jìn)下面的 RDBMS 表格中:

create table EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

第一個(gè)問(wèn)題,如果我們開發(fā)了幾頁(yè)代碼或應(yīng)用程序后,需要修改數(shù)據(jù)庫(kù)的設(shè)計(jì)怎么辦?

第二個(gè)問(wèn)題,在關(guān)系型數(shù)據(jù)庫(kù)中加載和存儲(chǔ)對(duì)象時(shí)我們要面臨以下五個(gè)不匹配的問(wèn)題。

不匹配 描述
粒度 有時(shí)你將會(huì)有一個(gè)對(duì)象模型,該模型類的數(shù)量比數(shù)據(jù)庫(kù)中關(guān)聯(lián)的表的數(shù)量更多
繼承 RDBMSs 不會(huì)定義任何在面向?qū)ο缶幊陶Z(yǔ)言中本來(lái)就有的繼承
身份 RDBMS 明確定義一個(gè) 'sameness' 的概念:主鍵。然而,Java 同時(shí)定義了對(duì)象判等(a==b)和 對(duì)象值判等(a.equals(b))
關(guān)聯(lián) 面向?qū)ο蟮木幊陶Z(yǔ)言使用對(duì)象引用來(lái)表示關(guān)聯(lián),而一個(gè) RDBMS 使用外鍵來(lái)表示對(duì)象關(guān)聯(lián)
導(dǎo)航 在 Java 中和在 RDBMS 中訪問(wèn)對(duì)象的方式完全不相同

Object-Relational Mapping (ORM) 是解決以上所有不匹配問(wèn)題的方案。

什么是 ORM?

ORM 表示 Object-Relational Mapping (ORM),是一個(gè)方便在關(guān)系數(shù)據(jù)庫(kù)和類似于 Java, C# 等面向?qū)ο蟮木幊陶Z(yǔ)言中轉(zhuǎn)換數(shù)據(jù)的技術(shù)。一個(gè) ORM 系統(tǒng)相比于普通的 JDBC 有以下的優(yōu)點(diǎn)。

序號(hào) 優(yōu)點(diǎn)
1 使用業(yè)務(wù)代碼訪問(wèn)對(duì)象而不是數(shù)據(jù)庫(kù)中的表
2 從面向?qū)ο筮壿嬛须[藏 SQL 查詢的細(xì)節(jié)
3 基于 JDBC 的 'under the hood'
4 沒有必要去處理數(shù)據(jù)庫(kù)實(shí)現(xiàn)
5 實(shí)體是基于業(yè)務(wù)的概念而不是數(shù)據(jù)庫(kù)的結(jié)構(gòu)
6 事務(wù)管理和鍵的自動(dòng)生成
7 應(yīng)用程序的快速開發(fā)

一個(gè) ORM 解決方案由以下四個(gè)實(shí)體組成:

序號(hào) 優(yōu)點(diǎn)
1 一個(gè) API 來(lái)在持久類的對(duì)象上實(shí)現(xiàn)基本的 CRUD 操作
2 一個(gè)語(yǔ)言或 API 來(lái)指定引用類和屬性的查詢
3 一個(gè)可配置的服務(wù)用來(lái)指定映射元數(shù)據(jù)
4 一個(gè)技術(shù)和事務(wù)對(duì)象交互來(lái)執(zhí)行 dirty checking, lazy association fetching 和其它優(yōu)化的功能

Java ORM 框架

在 Java 中有幾個(gè)持久化的框架和 ORM 選項(xiàng)。一個(gè)持久化的框架是 ORM 存儲(chǔ)和索引對(duì)象到關(guān)系型數(shù)據(jù)庫(kù)的服務(wù)。

  • Enterprise JavaBeans Entity Beans
  • Java Data Objects
  • Castor
  • TopLink
  • Spring DAO
  • Hibernate
  • And many more
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)