JDBC 代表 Java Database Connectivity ,它是提供了一組 Java API 來訪問關(guān)系數(shù)據(jù)庫的 Java 程序。這些 Java APIs 可以使 Java 應(yīng)用程序執(zhí)行 SQL 語句,能夠與任何符合 SQL 規(guī)范的數(shù)據(jù)庫進行交互。
JDBC 提供了一個靈活的框架來編寫操作數(shù)據(jù)庫的獨立的應(yīng)用程序,該程序能夠運行在不同的平臺上且不需修改,能夠與不同的 DBMS 進行交互。
JDBC 的優(yōu)點 | JDBC 的缺點 |
---|---|
干凈整潔的 SQL 處理 | 大項目中使用很復(fù)雜 |
大數(shù)據(jù)下有良好的性能 | 很大的編程成本 |
對于小應(yīng)用非常好 | 沒有封裝 |
易學(xué)的簡易語法 | 難以實現(xiàn) MVC 的概念 |
查詢需要指定 DBMS |
當(dāng)我們工作在一個面向?qū)ο蟮南到y(tǒng)中時,存在一個對象模型和關(guān)系數(shù)據(jù)庫不匹配的問題。RDBMSs 用表格的形式存儲數(shù)據(jù),然而像 Java 或者 C# 這樣的面向?qū)ο蟮恼Z言它表示一個對象關(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)考慮以上的對象需要被存儲和索引進下面的 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)
);
第一個問題,如果我們開發(fā)了幾頁代碼或應(yīng)用程序后,需要修改數(shù)據(jù)庫的設(shè)計怎么辦?
第二個問題,在關(guān)系型數(shù)據(jù)庫中加載和存儲對象時我們要面臨以下五個不匹配的問題。
不匹配 | 描述 |
---|---|
粒度 | 有時你將會有一個對象模型,該模型類的數(shù)量比數(shù)據(jù)庫中關(guān)聯(lián)的表的數(shù)量更多 |
繼承 | RDBMSs 不會定義任何在面向?qū)ο缶幊陶Z言中本來就有的繼承 |
身份 | RDBMS 明確定義一個 'sameness' 的概念:主鍵。然而,Java 同時定義了對象判等(a==b)和 對象值判等(a.equals(b)) |
關(guān)聯(lián) | 面向?qū)ο蟮木幊陶Z言使用對象引用來表示關(guān)聯(lián),而一個 RDBMS 使用外鍵來表示對象關(guān)聯(lián) |
導(dǎo)航 | 在 Java 中和在 RDBMS 中訪問對象的方式完全不相同 |
Object-Relational Mapping (ORM) 是解決以上所有不匹配問題的方案。
ORM 表示 Object-Relational Mapping (ORM),是一個方便在關(guān)系數(shù)據(jù)庫和類似于 Java, C# 等面向?qū)ο蟮木幊陶Z言中轉(zhuǎn)換數(shù)據(jù)的技術(shù)。一個 ORM 系統(tǒng)相比于普通的 JDBC 有以下的優(yōu)點。
序號 | 優(yōu)點 |
---|---|
1 | 使用業(yè)務(wù)代碼訪問對象而不是數(shù)據(jù)庫中的表 |
2 | 從面向?qū)ο筮壿嬛须[藏 SQL 查詢的細節(jié) |
3 | 基于 JDBC 的 'under the hood' |
4 | 沒有必要去處理數(shù)據(jù)庫實現(xiàn) |
5 | 實體是基于業(yè)務(wù)的概念而不是數(shù)據(jù)庫的結(jié)構(gòu) |
6 | 事務(wù)管理和鍵的自動生成 |
7 | 應(yīng)用程序的快速開發(fā) |
一個 ORM 解決方案由以下四個實體組成:
序號 | 優(yōu)點 |
---|---|
1 | 一個 API 來在持久類的對象上實現(xiàn)基本的 CRUD 操作 |
2 | 一個語言或 API 來指定引用類和屬性的查詢 |
3 | 一個可配置的服務(wù)用來指定映射元數(shù)據(jù) |
4 | 一個技術(shù)和事務(wù)對象交互來執(zhí)行 dirty checking, lazy association fetching 和其它優(yōu)化的功能 |
在 Java 中有幾個持久化的框架和 ORM 選項。一個持久化的框架是 ORM 存儲和索引對象到關(guān)系型數(shù)據(jù)庫的服務(wù)。
更多建議: