3.1 ODBC và JDBC Drivers
Database clients sử dụng database drivers để gửi câu lệng SQL đến database servers
và nhận kết quả trả lời . Các ứng dụng Java và applet sử dụng JDBC drivers để giao tiếp
với database servers.."
Microsoft's ODBC
Nhiều database servers sử dụng các giao thức chuyên biệt của nhà sản xuất. Điều
này có nghĩa là database client phải học một ngôn ngữ mới để nói với các database server
khac nhau.
Tuy nhiên, Microsoft đã thiét lập một chuẩn chung để giao tiép databases, gọi là
Open Database Connectivity (ODBC). Trước khi có ODBC, nhiều database clients là phụ
thuộc server cụ thể. ODBC drivers trừu tượng hoá các giao thức chuyên biệt của nhiều
nhà sản xuất, cung cấp các API chung nhất cho database clients. Viết database clients sử
3.2 Tại sao cần JDBC
JDBC drivers không giao tiếp trực tiếp với nhiều sản phẩm CSDL như ODBC
drivers. Nhiều JDBC drivers giao tiếp với databases dùng ODBC. Một trong số JDBC drivers đầu tiên là JDBC-ODBC bridge driver do JavaSoft và Intersolv phát triển.
Tại sao cần JDBC trong khi đã có ODBC? Đơn giản là JDBC là giải pháp tốt hơn cho
các ứng dụng Java và applets:
ODBC là API viết bằng C, không phải Java API. Java là ngôn ngữ hướng đối tưọng, còn C thì không. C dùng kiểu con trỏ và các cấu trúc “nguy hiểm” khác mà Java không hỗ trợ. Nếu viết lạI ODBC bằng Java sẽ cần thay đổi đáng kể các
ODBC API.
ODBC drivers phải được cài đặt trên máy khách. Điều này có nghĩa là applet truy cập CSDL buộc phải yêu cầu tải xuống và cài đặt JDBC driver. Giải pháp gọi là thuần Java (pure Java) cần cho phép JDBC tự động tảI xuống và cài đặt cùng với applet. Điều này làm cho NSD applet thuận lợi hợn.
JDBC-ODBC bridge driver không phảI là một giảI pháp đẹp, nhưng nó cho phép các
nhà phát triển sử dụng ODBC drivers đang có.
3.3 Các kiểu JDBC driver
Kể từ khi phổ biến JDBC API, một số JDBC drivers đã được xây dựng. Các drivers ấy có nhiều mức. JavaSoft đã phân loại JDBC drivers thành 4 kiểu driver :
JDBC-ODBC bridge plus ODBC driver
Đây là JDBC-ODBC bridge driver nguyên thuỷ. JDBC-ODBC bridge driver sử
dụng ODBC driver của Microsoft để giao tiếp với server CSDL. Nó được triẻn khai dưới cả hai dạng mã nhị phân và mã Java và phải được cài đặt trước trên máy khách
trước khi có thể sử dụng.
Native-API partly Java driver
Đây là các drivers mà nói với servers CSDL bằng các giao thức native của servers
CSDL. Ví dụ, Oracle driver sẽ nói bằng SQLNet, còn DB2 driver sẽ dùng giao thức
CSDL của IBM . Các drivers này được triển khai kết hợp cả mã nhị phân và mã Java, và cungc phảI càI đặt trước trên máy khách.
JDBC-Net pure Java driver.
Đây là kiểu gồm các drivers thuần Java, sử dụng giao thức mạng chuẩn ví dụ HTTP) để nói với server truy cập CSDL - database access server. Sau đó, server truy cập CSDL
thông dịch giao thức mạng thành giao thức của nhà sản xuất CSDL ( có thê thông qua một ODBC driver).
Native-protocol pure Java driver
Đây là kiểu gồm các driver thuần Java, sử dụng giao thức của nhà sản xuất CSDL được thiết kế để giao tác với nó.
Trong 4 kiểu trên chỉ có Type 3 và Type 4 là drivers thuần Java.
Hỗ trợ zero installation đối với applets là rất quan trọng.
Driver kiểu 4 giao tiếp với server CSDL sử dụng giao thức riêng của nhà sản xuất.
Drives kiểu 3 sử dụng database access server. Nó truyên thông với database access
server bằng một giao thức mạng chuẩn, ví dụ HTTP. Database access server giao tiếp với
servers CSDL sử dụng giao thức riêng của nhà sản xuất hay một ODBC drivers. Một ví dụ về kiẻu 3 là IDS JDBC driver
4. Thiết lập Driver 4.1 Tìm hiểu Driver
Để sử dụng JDBC, cần có database server và database driver. Có thể chọn ví dụ
Microsoft Access vì nó phổ biến. Khi đã biết cách kết nối thì dùng server nào là không quan trọng. JDBC cung cấp truy nhập CSDL độc lập với server.
Driver CSDL là cầu nối JDBC và CSDL. JDBC đi kèm với JDBC-ODBC bridge. Cầu nối này cho phép bạn truy nhập CSDL thông qua Open Database Connectivity API
của Microsoft. Tuy nhiên, JDBC-ODBC bridge là giải pháp tạm thời, nhiều nhược điểm,
Một Driver pure Java, zero installation là JDBC driver của IDS Software
(http://www.idssoftware.com). NSD chạy applet có thể truy nhập CSDL không cần cài
đặt trước một Driver trên máy của mình.
4.2 Lớp DriverManager
Lớp DriverManager của java.sql dùng để quản trị các JDBC drivers được cài đặt
trong hệ thống của bạn. Chúng được cài đặt bằng cách thiết lập hệ thống jdbc.drivers
system hoặc nạp dùng phương thức forName().
Chương trình DriverApp, trình bày dưới đây minh hoạ cách thức nạp JDBC driver
dùng forName()
Lớp DriverManager không có constructor, mọi phương thức đều là static.
Hai phương thức quan trọng nhất của lớp DriverManager là getDrivers() và getConnection()
GetDrivers() liệt kê mọi JDBC drivers được cài đặt trong hệ thống.
getConnection() sẽ thiết lập một kết nối tới CSDL. Phương thức này có 3 dạng:
getConnection(String url)
getConnection(String url,String userID,String password) getConnection(String url,Properties arguments)
Dạng 1 có đối là một String để chỉ ra URL của CSDL. Dạng 2 có thêm hai đối
string: user ID và password. Dạng 3 cần thêm các tính chất khác ví dụ user ID,
password, database name ...
Quy định về URL dùng để thiết lập kết nối đến CSDL là khác nhau tuỳ theo JDBC drivers nào được sử dụng, nhưng nói chung có dạng sau:
Mọi giao thức CSDL JDBC bắt đầu với jdbc: subprotocol. dùng để chỉ ra cơ chế
kết nối hoặc JDBC driver.
Ví dụ, JDBC-ODBC bridge dùng giao thức dạng jdbc:odbc:subname IDS JDBC driver dùng giao thức dạng jdbc:ids:subname. Subname của một giao thức CSDL chỉ ra CSDL và các tham số khác.
Ví dụ, URL để thiết lập kết nối đến CSDL của Microsoft Access có tên là DataSetName tại máy chủ cx122974-a.cv1.sdca.home.com tại cổng 80, có dạng sau :
jdbc:ids://cx122974-a.cv1.sdca.home.com:80/ conn?dbtype=odbc&dsn=DataSetName
các phương thức khác :
getDriver()--cho biết driver hỗ trợ kết nối đến một URL cụ thể.
registerDriver()--để drivers tự đăng kí với DriverManager.
deregisterDriver()--để driver huỷ đăng kí.
getLoginTimeout()--cho biết thời gian hạn định tối đa một drivers cố thử log in
vào CSDL.
setLoginTimeout()--thiết đặt thời gian hạn định tối đa trên. getLogStream()--cho biết stream dùng để logging.
setLogStream()-- ấn định stream nói trên. println()--Viết dữ liệu vào log stream.
4.3 Driver Interface
Xây dựng một JDBC driver là một lớp để triển khai Driver interface. Dưới đây là một vài phương thức của Driver interface:
connect()--thiết lập kết nối. DriverManager sẽ gọi nó để lập kết nối cho driver
tương ứng.
acceptsURL()--Cho biết driver có thể mở một kết nối CSDL qua URL đã cho hay không.
getPropertyInfo()--Cho mảng DriverPropertyInfo cung cấp các thông tin về cách
sử dụng driver để kết nối đến CSDL.
getMajorVersion()--Cho số chính của version của driver.
getMinorVersion()--Cho số phụ của version.
jdbcCompliant()--cho biết driver có hoàn toàn tương hợp JDBC-compliant hay không.
4.4 Chương trình DriverApp
Chương trình DriverApp minh hoạ cách sử dụng các lớp DriverManager và DriverPropertyInfo và Driver interface.
Khi chạy chương trình, nó sẽ cho kết quả dạng như sau:
Driver: ids.sql.IDSDriver Major version: 2 Minor version: 5 JDBC compliant: true Properties: Name: dsn
Description: Data Source Name or Database Name Value: null Required: true Name: user Description: User ID Value: null Required: false Name: password Description: Password Value: null Required: false Driver: sun.jdbc.odbc.JdbcOdbcDriver Major version: 1 Minor version: 2001 JDBC compliant: true
DriverApp cung cấp nhiều thông tin có ích về driver mà bạn có thể sử dụng để kết
nối đến CSDL. Chương trình nạp ids.sql.IDSDriver và sun.jdbc.odbc.JdbcOdbcDriver bằng cách gọi phương thức forName() của lớp Class. Sau đó nó gọi phương thức
getDrivers() của DriverManager và trả về một đối tượng Enumeration các drivers được
nạp. Một vòng lặp duyệt qua đối tượng Enumeration và hiển thị các thông tin về từng driver. Các phương thức getClass() để lấy lớp của driver, getName() để lấy tên của lớp, ...
Phương thức getPropertyInfo() sẽ trả về một mảng các đối tượng DriverPropertyInfo. Sau đó chương trình hiển thị tên, mô tả, giá trị, các lựa chọn ... của từng đối tượng.
Chương trình DriverApp .
import java.sql.*; import java.util.*; class DriverApp {
public static void main(String args[]) { try{
// Load the database drivers
Class.forName("ids.sql.IDSDriver");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Obtain a list of the loaded drivers
Enumeration drivers = DriverManager.getDrivers(); System.out.println("Available drivers:");
while(drivers.hasMoreElements()){
Driver driver=(Driver)drivers.nextElement(); // Display information about each driver
System.out.println(" Driver: "+driver.getClass().getName()); System.out.println(" Major version: "+driver.getMajorVersion()); System.out.println(" Minor version: "+driver.getMinorVersion()); System.out.println(" JDBC compliant: "+driver.jdbcCompliant());
// Get driver properties
DriverPropertyInfo props[] = driver.getPropertyInfo("",null); if(props!=null){
// Display each property and its value
System.out.println(" Properties: "); for(int i=0;i<props.length;++i){
System.out.println(" Name: "+props[i].name);
System.out.println(" Description: "+props[i].description); System.out.println(" Value: "+props[i].value);
if(props[i].choices!=null){
System.out.println(" Choices: "); for(int j=0;j<props[i].choices.length;++j)
System.out.println(" "+props[i].choices[j]); }
System.out.println(" Required: "+props[i].required); } } } }catch(Exception ex){ System.out.println(ex); System.exit(0); } } } 4.5 Thiết lập kết nối đến CSDL Connection Interface
Khi dùng getConnection() để kết nối đến CSDL nó sẽ trả về một đối tượng với Connection interface. Interface này định nghĩa các phương thức để tương tác với CSDL
thông qua kết nối đã thiết lập. Nó cũng xác định một số hằng mô tả cách thức CSDL hỗ
trợ các giao tác.
Các phương thức của Connection interface dùng để quản trị kết nối, nhận thông tin
về kết nối, roll back hay commit một giao tác, và chuẩn bị một câu lệnh SQL.
Một số phương thức quan trọng sẽ được nêu dưới đây:
close()--đóng kết nối.
getMetaData()--Trả về một DatabaseMetaData interface dùng để lấy các thông tin
chi tiết về cấu trúc và khả năng của CSDL.
createStatement()--Tạo một câu lệnh SQL.
prepareStatement()--Tạo một đối tượng PreparedStatement SQL, từ một SQL
string. PreparedStatement là một câu lệnh SQL tiền biên dịch, thực hiện hiệu qủa hơn.