Truy nhập CSDL

Một phần của tài liệu Giáo trình ngôn ngữ JAVA (Trang 54 - 60)

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.

Một phần của tài liệu Giáo trình ngôn ngữ JAVA (Trang 54 - 60)