JDBC資料庫訪問(一)——JDBC簡介
目錄
1.JDBC簡介
JDBC API是Java API,可以用來訪問任意表格型別的資料,特別是儲存在關係型資料庫中的資料。
JDBC可以幫助編寫涉及以下三種程式設計活動的java應用
- 連線到資料來源(eg:資料庫)
- 給資料庫傳送查詢與更新語句
- 檢索處理資料庫查詢的返回結果
1.1JDBC的產品元件
The JDBC API
JDBC提供了程式設計方法訪問關聯資料。
使用JDBC API,應用可以執行SQL語句,檢索結果並且將結果傳送給底層資料來源。
JDBC API可以同時與位於分佈異構環境下的多個數據源進行互動。
JDBC 4.0 API劃分進兩個包:java.sql與javax.sql。
JDBC Driver Manager
DriverManager類定義了連線Java應用與JDBC驅動的物件。
傳統上,DriverManager是JDBC架構的支柱。
標準擴充套件包,javax.naming與javax.sql使應用可以使用通過JDNI命名服務註冊的DataSource物件建立與資料來源的連線。
JDBC Test Suite
The JDBC驅動測試套件幫助開發者確定驅動將要執行程式。
這些測試並不詳實全面,但是它們執行了JDBC API中的許多重要特性。
JDBC-ODBC Bridge
Java軟體橋接器通過ODBC驅動提供了JDBC方法。
注意,需要在使用了驅動的每一個客戶端機器上載入ODBC的二進位制程式碼。
結果,ODBC驅動最適合客戶端安裝不是主要問題的公司網路,或者是三層架構中用java編寫的應用伺服器程式碼。
1.2JDBC架構
JDBC API同時支援用於資料庫訪問的兩層處理模型與三層處理模型。
在兩層模型中,java應用直接與資料來源對話,這需要可以與被訪問資料來源溝通的JDBC驅動。
使用者的命令被髮送給資料庫或其他的資料來源,這些語句的結果會被返還給使用者。資料來源可能位於使用者通過網路連線的另一臺機器上。
這即是一種C/S配置,使用者機器為客戶端,資料來源所在的機器為服務端。網路可以是內聯網也可以是網際網路。
在三層模型中,命令被髮往中間層。
中間層將命令傳送給資料來源,資料來源處理這些命令,然後將結果返還中介層,最終中間層將它們傳送給使用者。
MIS主管發現三層模型非常有吸引力,因為中間層可以維護對訪問的控制以及對企業資料的更新。
中間層還可以簡化應用的部署,而且在很多場景下,三層架構可以提供效能優勢。
中間層過去常常使用C、C++等可以提供高效能的語言編寫。
由於,可以將java位元組碼轉為更有效率的機器程式碼的優化編譯器等技術的引入,Java平臺的效能得到提升,成為了中間層開發的標準平臺。
隨著企業越來越多地使用java語言編寫服務端程式碼,JDBC越來越多地用於三層架構中的中間層。
令JDBC稱為服務端技術地特性包括,連線池支援、分散式事務、分離式行集。
JDBC API允許從中間層訪問資料來源。
1.3關係型資料庫概覽
資料庫是儲存資訊的一種方法,可以從資料庫訪問資料。
關係型資料庫就是使用表格表示資訊資料庫。
一張表可以被稱之為一個關係,某種意義上來說,它是相同型別(行)物件的集合。
表中的資料通過公共的鍵或概念關聯,從表中檢索資訊的能力是關係型資料庫的基礎。
Database Management System(DBMS)持有儲存、維護、檢索資料的方法。
RDBMS屬於DBMS的一種。
完整性規則
關係表遵守一些完整性規則,這些規則確保持有的資料準確可被訪問。
關係表中的行應該各不相同
傳統關係模型中的列不能是重複組或陣列
主鍵中的任何列都不為null
資料庫使用使用null指示值缺少。null與空白或零不等價。
空白與另一個空白等價,零與另一個零等價。但兩個null不會被認為定價。
SELECT 語句
SQL是用於關係型資料庫的語言。
SELECT語句,又稱為query(查詢),用於獲取表中的資訊。
SELECT語句指定一個或多個列標題,一個或多個被查詢的表以及一些用於選擇的條件。
RDBMS返回滿足要求的列條目的行集合。
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number IS NOT NULL
WHERE 子句
SELECT語句中的WHERE子句提供了查詢值的條件。
字串匹配作為條件
SELECT First_Name, Last_Name
FROM Employees
WHERE Last_Name LIKE 'Washington%'
note:獲取以Last_Name資料值以Washington開頭的所有行。
ps:LIKE關鍵字用於比較字串,它提供了可以使用萬用字元的模式的特性。
ps:_萬用字元代表任意一個字元,eg:Ba_man匹配Barman、Badman等。
數字比較作為條件
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number = 12
note:獲取以Car_Number等於12的所有行。
拼接條件
SELECT First_Name, Last_Name
FROM Employees
WHERE Employee_Number < 10100 and Car_Number IS NULL
note:獲取Employee_Number小於10100並且Car_Number不為NULL的所有行。
聯接
關係型資料庫的一個顯著特點就是可以通過連線訪問多個表中的資料。
假設,在檢索了擁有公司汽車的員工之後,還想知道哪一個員工擁有哪一輛車。
此時,必須存在一個列,同時出現在兩個表內,將兩個表關聯起來。
這個列必須是一個表的主鍵,這個列在另一張表中稱之為外來鍵。
在這個例子中,Car_Number同時出現在兩個表中,並且為Cars表的主鍵,所以也是Employee表的外來鍵。
如果1996年的車牌號為ABC123的車失事並且將其從Cars表中刪除,那麼Employee表中的 Car_number 5也需要被刪除,即維護引用完整性。
如果Employee不刪除,那麼Employee表中的外來鍵列Car_Number將會出現一個不會引用Cars表中任何條目的條目。
引用完整性:一個外來鍵要為null,要麼等價於其所指向的主鍵值。
多表查詢
SELECT Employees.First_Name, Employees.Last_Name,
Cars.License_Plate, Cars.Mileage, Cars.Year
FROM Employees, Cars
WHERE Employees.Car_Number = Cars.Car_Number
note:查詢哪個員工擁有哪輛車。
常用SQL命令
SQL命令分為兩類,一類為Data Manipulation Language(DML)命令,一類為Data Definition Languate(DDL)命令。
DML命令處理資料,檢索資料,或更新資料以保持最新。
DDL命令建立或修改表與其他資料庫物件(eg:檢視、索引)。
常見DML命令:
- SELECT:用於從資料庫中查詢列印資料。
- INSERT:向表中新增新行。
- DELETE:從表中移除一個指定行或一個指定行集合。
- UPDATE:將表中一個列或一組列的已存在值進行修改,
常見的DDL命令:
- CREATE TABLE:使用使用者提供的列名建立表。
- DROP TABLE:刪除所有行並且將表定義從資料庫中移除。
- ALTER TABLE:新增或移除表中的類,新增或移除表約束,修改列屬性。
結果集與遊標
滿足查詢條件的行集合稱之為結果集。結果集中行數量可以為0、1或許多。
使用者一次可以訪問結果集中的一行,遊標提供了此方法。
遊標可以看作是指標,指向正在結果集中正在被訪問的列。
遊標可以使使用者從頭到底地處理結果集中的每一行,因此可以用於迭代處理。
當結果集生成時,許多DBMS自動建立了一個遊標。
早期的JDBC API版本為結果集的遊標新增新功能,允許它向前移動或向後移動,並且允許它移動到特定行或相對於其他行的位置。
事務
當一個使用者訪問資料庫中的資料時,另一個使用者在相同的時間訪問相同的資料。
如果,第一個使用者更新了表中的部分列,與此同時第二個使用者正在查詢同一個表。
這樣,第二個使用者可能獲得一部分舊資料,一部分更新後的資料。
出於這個原因,當允許多個使用者在同一時間訪問資料庫(資料併發性)時,DBMS使用事務來維護資料的狀態一致性(資料一致性)。
事務是一條或多條SQL語句構成的集合,這些SQL語句構成了一個邏輯工作單元。
事務以一個提交或回滾結束,具體以兩者中的哪一者結尾,取決於事務執行過程中是否出現數據一致性、資料併發行問題。
提交命令使事務產生與事務中SQL語句對應的永久性更改,回滾命令使事務中SQL語句執行引發的改變全部撤銷。
用於阻止兩個事務同時操作相同資料的機制是鎖機制。
eg:如果表上仍然存在未提交的事務,表鎖阻止表的刪除。
一些DBMS中,表鎖會鎖住一張表中的所有行。
行鎖會阻止兩個事務同時修改同一行。
當行被事務修改時,行鎖會阻止另一事務讀取此行。
儲存過程
儲存過程是可以通過名稱呼叫的一組SQL語句。
儲存過程是可呼叫程式碼,一個執行特定任務可以像呼叫方法或函式一樣呼叫的微型程式。
通常情況下,儲存過程通過DBMS特定的程式語言編寫。
最新一代的資料庫產品允許使用Java語言與JDBC API編寫儲存過程。
使用Java程式編寫的位元組碼可以在不同的BDMS之間移動。
一旦儲存過程編寫完成,它便可以使用與複用,因為DBMS支援將其儲存在資料庫之中。
元資料
資料庫除了儲存使用者資料,還會儲存資料庫本身的相關資訊。
大多數DBMS都會有一個系統表集合,表中列出了資料庫中的表,每個表中的列名、主鍵、外來鍵、儲存外來鍵等。
每一個DBMS都有自己的功能來獲取有關表佈局以及資料庫特性的資訊。
JDBC提供了介面DatabaseMetaData,驅動編寫者必須實現這個介面,應用可以通過這個介面中的方法獲取有關驅動與DBMS的資訊。