Tải bản đầy đủ (.pdf) (57 trang)

Chuẩn bị cho Kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 7: Lập trình Java ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (213.82 KB, 57 trang )

Chuẩn bị cho Kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 7: Lập trình
Java
Dirk deRoos, Kiến trúc sư IT, IBM Toronto Lab
Tóm tắt: Tìm hiểu về cách viết mã Java® có giao diện với các cơ sở dữ liệu
DB2. Đây là Phần 7 trong một loạt bài gồm chín hướng dẫn mà bạn có thể sử dụng
để giúp chuẩn bị cho kỳ thi lấy chứng chỉ phát triển ứng dụng họ DB2® 9 của
IBM® (kỳ thi 733).
Trước khi bạn bắt đầu
Về loạt bài viết này
Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với mọi người
rằng bạn là một nhà phát triển ứng dụng DB2 cho Linux, UNIX và Windows mức
trung cấp hoặc cao cấp và cho biết rằng bạn có các kỹ năng giỏi trong tất cả các
công việc lập trình chung cũng như lập trình SQL nhúng, lập trình ODBC/CLI, lập
trình .NET hoặc lập trình Java.
Loạt bài gồm chín hướng dẫn miễn phí này được thiết kế để giúp bạn chuẩn bị cho
kỳ thi lấy chứng chỉ Phát triển ứng dụng DB2 9 cho Linux, UNIX và Windows (kỳ
thi 733). Mỗi hướng dẫn bao gồm một liên kết đến một bản tải về dùng thử miễn
phí DB2 9 cho Linux, UNIX và Windows. Các hướng dẫn này cung cấp một cơ sở
vững chắc cho mỗi phần của kỳ thi. Tuy nhiên, bạn không nên dựa vào các hướng
dẫn này như là sự chuẩn bị duy nhất của bạn cho kỳ thi này.


Về hướng dẫn này
Trong hướng dẫn này, bạn sẽ tìm hiểu về cách viết mã Java có giao diện với các
cơ sở dữ liệu DB2. Bạn sẽ thấy làm thế nào để:
 Kết nối với một cơ sở dữ liệu DB2 từ một ứng dụng Java.
 Sử dụng JDBC để đọc và cập nhật dữ liệu trong một cơ sở dữ liệu DB2.
 Sử dụng SQL với Java (SQLJ) để đọc và cập nhật dữ liệu trong một cơ sở
dữ liệu DB2.
 Xử lý lỗi một ứng dụng Java DB2.
Hướng dẫn này cung cấp cho bạn những kỹ năng cơ bản cần thiết để phát triển các


ứng dụng Java cho DB2.


Các điều kiện cần trước
Để tham dự kỳ thi Phát triển ứng dụng Họ DB2 9, bạn đã phải vượt qua được kỳ
thi cơ bản về họ DB2 9 (kỳ thi 730). Bạn có thể sử dụng Loạt bài hướng dẫn Cơ
bản về họ DB2 (DB2 Family Fundamentals tutorial series) (xem phần Tài nguyên)
để chuẩn bị cho kỳ thi đó. Đây là một loạt hướng dẫn rất phổ biến đã giúp cho
nhiều người hiểu các vấn đề cơ bản về họ các sản phẩm DB2.
Mặc dù không phải tất cả các tư liệu được thảo luận trong loạt bài hướng dẫn Cơ
bản về họ DB2 này là cần thiết để hiểu các khái niệm được mô tả trong hướng dẫn
này, nhưng bạn cần phải có một kiến thức cơ sở về:
 Các cá thể DB2.
 Các cơ sở dữ liệu.
 Các đối tượng cơ sở dữ liệu.
 An ninh DB2.
Bạn cũng cần phải có kiến thức cơ sở về SQL và nền tảng Java trước khi bắt đầu
tìm hiểu hướng dẫn này. Bạn có thể xem lại phần Tài nguyên ở phần cuối của
hướng dẫn này để biết thêm thông tin.


Các yêu cầu hệ thống
Bạn không cần một bản sao của DB2 để hoàn thành hướng dẫn này. Tuy nhiên,
bạn có thể tải về một bản DB2 Express-C miễn phí từ trang tải về DB2 Express-C.
Nếu bạn có kế hoạch phát triển các ứng dụng Java cho DB2 hoặc bạn có kế hoạch
tự mình thử nghiệm mã mẫu của hướng dẫn này, bạn cần phải hoàn thành nhiệm
vụ sau:
1. Cài đặt DB2 9 cho Linux, UNIX và Windows.
2. Tạo cơ sở dữ liệu mẫu. Bạn có thể làm điều này từ trình đơn Các bước đầu
tiên tạo cơ sở dữ liệu (First Steps Database Creation) hoặc bằng cách chạy

db2sampl từ trình xử lý dòng lệnh DB2 (CLP- Command Line Processor). Mã
mẫu trong bài viết này đã được viết để làm việc với cơ sở dữ liệu ấy.
3. Cài đặt Môi trường thời gian chạy chạy Java, Ấn bản công nghệ Java 2,
Phiên bản 1.4.2 (Java Runtime Environment , Java 2 Technology Edition Version
1.4.2).
4. Cập nhật biến môi trường PATH để chứa thư mục jdk\bin của Java SDK
mà bạn đã cài đặt. Lưu ý rằng DB2 bao gồm Phiên bản 5 của SDK Java, trong thư
mục $DB2PATH\sqllib\java\jdk\bin ($DB2PATH/sqllib/java/jdk/bin trong UNIX
hoặc Linux).

Các môi trường phát triển
Tổng quan
Có nhiều môi trường ở đó bạn có thể phát triển các ứng dụng Java của bạn để sử
dụng với các cơ sở dữ liệu DB2. DB2 9.1 cung cấp hai tùy chọn:
 Bàn làm việc của nhà phát triển DB2 (DB2 Developer Workbench):
Một môi trường phát triển có tích hợp đồ họa.
 Dòng lệnh DB2 (DB2 command line): Môi trường cốt lõi ở đó bạn có thể
thi hành các lệnh hoặc các kịch bản lệnh để xây dựng và chạy các ứng dụng mà
bạn đã viết bằng một trình soạn thảo văn bản.
Bàn làm việc của nhà phát triển DB2
Bàn làm việc của nhà phát triển DB2 là một môi trường phát triển dựa trên Eclipse
có cung cấp các khả năng sau đây, ngoài cơ sở hạ tầng phát triển ứng dụng Java
của Eclipse :
 Duyệt và tạo ra các đối tượng cơ sở dữ liệu.
 Tạo, chỉnh sửa, gỡ rối, triển khai và thử nghiệm các thủ tục SQL lưu sẵn và
các hàm do người dùng định nghĩa.
 Phát triển các ứng dụng SQLJ.
 Tạo, chỉnh sửa và chạy các câu lệnh SQL.
 Tạo, chỉnh sửa và chạy các biểu thức Xquery.
Bàn làm việc của nhà phát triển DB2 có sẵn dưới dạng một bản tải về miễn phí

(xem phần Tài nguyên).


Dòng lệnh DB2
Từ dòng lệnh DB2, bạn có thể xây dựng và chạy các ứng dụng cơ sở dữ liệu Java
của bạn bằng cách sử dụng các lệnh javac, java và sqljcustomize. Các ví dụ trong
hướng dẫn này giải thích làm thế nào để xây dựng và chạy cả hai, các ứng dụng
SQLJ và các ứng dụng JDBC, từ dòng lệnh DB2.

Kết nối đến một cơ sở dữ liệu
Tổng quan
JDBC là một API Java mà thông qua nó các chương trình Java có thể kết nối với
các cơ sở dữ liệu quan hệ và thi hành các câu lệnh SQL. Để cho phép các ứng
dụng Java giao tiếp với các cơ sở dữ liệu của nó, DB2 có gồm chứa các trình điều
khiển JDBC.
Trong phần này, bạn sẽ tìm hiểu làm thế nào để nạp các trình điều khiển JDBC
thích hợp nhất cho ứng dụng của bạn và làm thế nào để kết nối với một cơ sở dữ
liệu DB2.
Các trình điều khiển JDBC
Một trình điều khiển JDBC hoạt động như một giao diện giữa một chương trình
JDBC và cơ sở dữ liệu. DB2 bao gồm hai trình điều khiển JDBC: trình điều khiển
JDBC DB2 Kiểu 2 và trình điều khiển IBM DB2 cho JDBC và SQLJ.
 Trình điều khiển JDBC DB2 Kiểu 2: Còn được gọi là trình điều khiển
ứng dụng (app driver). Các ứng dụng Java sử dụng trình điều khiển này phải chạy
trên một máy khách DB2, thông qua nó các yêu cầu JDBC chảy đến một máy chủ
DB2. Trình điều khiển này đã lạc hậu và bị loại khỏi DB2 9.1, và các bản phát
hành trong tương lai của DB2 sẽ không hỗ trợ hoặc gồm chứa trình điều khiển này
nữa. Chúng tôi đề nghị bạn sử dụng trình điều khiển IBM DB2 cho JDBC và
SQLJ thay cho Trình điều khiển JDBC DB2 Kiểu 2. Để nạp Trình điều khiển
JDBC DB2 Kiểu 2, hãy gọi phương thức Class.forName() có đối số là

COM.ibm.db2.jdbc.app.DB2Driver.
 Trình điều khiển JDBC DB2 cho JDBC và SQLJ: Nó cung cấp cả hai
kết nối Kiểu 2 và Kiểu 4. Bạn có thể sử dụng trình điều khiển này cho cả applet
lẫn các ứng dụng; nó được đề nghị là trình điều khiển cho cả hai. Để nạp Trình
điều khiển JDBC DB2 cho JDBC và SQLJ, hãy gọi phương thức Class.forName()
có đối số com.ibm.db2.jcc.DB2Driver.
Để sử dụng một trong các trình điều khiển JDBC này trong ứng dụng của bạn, bạn
cần phải nhập khẩu các gói Java có chứa API JDBC:
import java.sql.*;

Tải về mã và các ứng dụng mẫu trong hướng dẫn này đã được thử nghiệm để làm
việc với các trình điều khiển JDBC DB2 cho JDBC và SQLJ.


Tạo một kết nối cơ sở dữ liệu
Khi bạn đã nạp trình điều khiển JDBC thích hợp, bạn có thể kết nối với một cơ sở
dữ liệu từ ứng dụng JDBC của bạn. Trong các ứng dụng JDBC, một đối tượng
Connection (kết nối) biểu diễn một kết nối cơ sở dữ liệu. Từ một đối tượng
DriverManager (có sẵn để sử dụng sau khi trình điều khiển JDBC đã được nạp),
bạn có thể sử dụng phương thức getConnection() để thu được một Connection (kết
nối). Trong ví dụ sau đây, Trình điều khiển IBM DB2 cho JDBC và SQLJ được
nạp và đối tượng DriverManager tạo ra một kết nối cơ sở dữ liệu Kiểu 2.
String url = "jdbc:db2:sample";
Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection con =
DriverManager.getConnection(url);

Với Trình điều khiển IBM DB2 cho JDBC và SQLJ, kiểu kết nối cơ sở dữ liệu
được xác định bởi URL được chuyển tới phương thức
DriverManager.getConnection(). Trong các URL như dưới đây, có liệt kê một tên

miền và số cổng của máy chủ cơ sở dữ liệu, đối tượng DriverManager tạo ra một
kết nối cơ sở dữ liệu Kiểu 4.
String url = "jdbc:db2:sample://localhost:5021";

Bạn cũng có thể tạo các đối tượng Connection khi sử dụng giao diện
DataSource.Giao diện này được khuyến khích nếu bạn đang viết mã sẽ được sử
dụng với nhiều máy chủ cơ sở dữ liệu và các trình điều khiển JDBC. Giao diện
DriverManager không khả chuyển, vì nó đòi hỏi ứng dụng phải chỉ rõ URL của
trình điều khiển và tên lớp của trình điều khiển JDBC của một nhà cung cấp cụ
thể. Các đối tượng DataSource có thể được định nghĩa và được quản lý trên các hệ
thống ở đó các ứng dụng của bạn chạy, sử dụng một công cụ như WebSphere. Khi
sử dụng một công cụ như vậy, một quản trị viên gán tên lô gic cho các đối tượng
DataSource và đăng ký chúng trong một danh mục của Java Naming and
Directory Interface (JNDI - Giao diện thư mục và đặt tên Java). Ứng dụng Java có
sử dụng đối tượng DataSource sau đó có thể gọi nó bằng tên logic của nó và
không cần bất kỳ thông tin nào về nguồn dữ liệu nằm bên dưới.


Kết nối cơ sở dữ liệu: Mã mẫu
Ứng dụng mẫu trong phần này giải thích các khái niệm sau đây:
 Nhập khẩu các gói Java có chứa API JDBC.
 Nạp Trình điều khiển IBM DB2 cho JDBC và SQLJ.
 Tạo một đối tượng Connection.
 Sử dụng DriverManager để mở một Connection.
Ứng dụng này là một trình vỏ (shell) của một ứng dụng JDBC điển hình các gói
JDBC được nhập khẩu, có một kết nối cơ sở dữ liệu và có logic xử lý lỗi trong các
khối try/catch (thử/bắt giữ). Để chứng tỏ rằng một kết nối cơ sở dữ liệu là thực sự
được thực hiện, đối tượng Connection yêu cầu tên của trình điều khiển JDBC đang
được sử dụng bằng cách dùng các phương thức
Connection.getMetaData().getDriverName().

//ConnDb.java
import java.sql.*;

class ConnDb
{
public static void main(String[] argv)
{
String url = "jdbc:db2:sample";
Connection con;

try
{
Class.forName("com.ibm.db2.jcc.DB2Driver");
con = DriverManager.getConnection (url);

System.out.println("JDBC driver name: " +
con.getMetaData().getDriverName());

con.close();
}
catch (ClassNotFoundException drvEx)
{
System.err.println("Could not load JDBC driver");
System.out.println("Exception: " + drvEx);
drvEx.printStackTrace();
}
catch(SQLException sqlEx)
{
while(sqlEx != null) {
System.err.println("SQLException information");

System.err.println("Error msg: " + sqlEx.getMessage());
System.err.println("SQLSTATE: " + sqlEx.getSQLState());
System.err.println("Error code: " + sqlEx.getErrorCode());
sqlEx.printStackTrace();
sqlEx=sqlEx.getNextException();
}
}
}
}

Để biên dịch tệp tin trên (có tên là ConnDb.java), hãy thi hành lệnh sau đây:
javac ConnDb.java


Để chạy ứng dụng đã biên dịch, hãy thi hành lệnh sau đây:
java ConnDb


Kết quả đầu ra của ứng dụng sẽ trông như sau:
JDBC driver name: IBM DB2 JDBC Universal Driver
Architecture

Đọc và cập nhật dữ liệu với JDBC
Tổng quan
Trong phần này, bạn sẽ học cách sử dụng các đối tượng JDBC Statement và
PreparedStatement như thế nào để biểu diễn các câu lệnh SQL trong JDBC. Bạn
cũng sẽ học cách làm thế nào để sử dụng đối tượng JDBC ResultSet, được trả về
bởi các đối tượng Statement và PreparedStatement có chứa các truy vấn SQL.
Đối tượng Statement
Các đối tượng Statement được tạo ra bằng cách sử dụng phương thức

Connection.createStatement(). Ví dụ:
Statement stmt;

stmt = con.createStatement();

Để thi hành một câu lệnh INSERT, UPDATE hoặc DELETE từ một đối tượng
Statement, hãy chuyển một chuỗi ký tự chứa câu lệnh đến phương thức
Statement.executeUpdate(). Ví dụ:
stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE
EMPNO = '000099'");

Để thi hành một truy vấn bằng cách sử dụng một đối tượng Statement, hãy chuyển
một chuỗi ký tự chứa câu lệnh SELECT đến phương thức
Statement.executeQuery() và lấy ra đối tượng ResultSet. Ví dụ:
ResultSet rs;
rs = stmt.executeQuery("SELECT
EMPNO, LASTNAME FROM
EMPLOYEE");

Để phân tích cú pháp một đối tượng ResultSet, trước tiên bạn phải tìm nạp mỗi
hàng bằng cách sử dụng phương thức ResultSet.next(). Sau đó, sau mỗi lần tìm
nạp, lấy ra các giá trị cột bằng cách sử dụng các phương thức có thể áp dụng đối
với kiểu dữ liệu tương ứng (ví dụ, ResultSet.getInt()).
rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE
FROM EMPLOYEE");
while (rs.next()) {
System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}




Đối tượng Statement: Mã mẫu
Ứng dụng sau đây giải thích tất cả các khái niệm được thảo luận trong phần trên:
 Tạo một đối tượng Statement.
 Thực hiện một câu lệnh INSERT, UPDATE hoặc DELETE.
 Thực hiện một truy vấn SQL.
 Phân tích cú pháp một đối tượng ResultSet.
Ứng dụng này chèn một bản ghi nhân viên vào trong bảng Nhân viên (Employee)
và sau đó chạy một truy vấn đối với bảng đó, yêu cầu mã số và tên họ nhân viên
của mỗi bản ghi.
//StmtDb.java
import java.sql.*;

class StmtDb
{
public static void main(String[] argv)
{
String url = "jdbc:db2:sample";
Connection con;
Statement stmt1, stmt2;
ResultSet rs;
String stmt1String =
"INSERT INTO EMPLOYEE
(EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
" VALUES ('000099','MICHIEL','G','DEROOS',1)";
String stmt2String = "SELECT EMPNO, LASTNAME FROM
EMPLOYEE";

try
{

Class.forName("com.ibm.db2.jcc.DB2Driver");
con = DriverManager.getConnection(url);
con.setAutoCommit(true);

stmt1 = con.createStatement();
stmt2 = con.createStatement();

stmt1.executeUpdate(stmt1String);
rs = stmt2.executeQuery(stmt2String);

System.out.println("Employee # Employee surname");
while (rs.next()) {
System.out.println(rs.getString(1) + " " + rs.getString(2));
}

rs.close();
stmt1.close();
stmt2.close();
con.close();

}
catch (ClassNotFoundException drvEx)
{
System.err.println("Could not load JDBC driver");
System.out.println("Exception: " + drvEx);
drvEx.printStackTrace();
}
catch(SQLException sqlEx)
{
while(sqlEx != null) {

System.err.println("SQLException information");
System.err.println("Error msg: " + sqlEx.getMessage());
System.err.println("SQLSTATE: " + sqlEx.getSQLState());
System.err.println("Error code: " + sqlEx.getErrorCode());
sqlEx.printStackTrace();
sqlEx=sqlEx.getNextException();
}
}
}
}

Để biên dịch tệp tin trên (có tên là StmtDb.java), hãy thi hành lệnh sau đây:
javac StmtDb.java


Để chạy các ứng dụng đã biên dịch, hãy thi hành lệnh sau đây:
java StmtDb


Kết quả đầu ra của ứng dụng này trông giống như sau:
Employee # Employee surname

000010 HAAS
000020 THOMPSON
000030 KWAN
000050 GEYER
000060 STERN
000070 PULASKI
000090 HENDERSON
000100 SPENSER

000110 LUCCHESSI
000120 O'CONNELL
000130 QUINTANA
000140 NICHOLLS
000150 ADAMSON
000160 PIANKA
000170 YOSHIMURA
000180 SCOUTTEN
000190 WALKER
000200 BROWN
000210 JONES
000220 LUTZ
000230 JEFFERSON
000240 MARINO
000250 SMITH
000260 JOHNSON
000270 PEREZ
000280 SCHNEIDER
000290 PARKER
000300 SMITH
000310 SETRIGHT
000320 MEHTA
000330 LEE
000340 GOUNOT
200010 HEMMINGER
200120 ORLANDO
200140 NATZ
200170 YAMAMOTO
200220 JOHN
200240 MONTEVERDE

200280 SCHWARTZ
200310 SPRINGER
200330 WONG
200340 ALONZO
000099 DEROOS



Đối tượng PreparedStatement
Các đối tượng PreparedStatement được tạo ra bằng cách sử dụng phương thức
Connection.prepareStatement(). Ví dụ:
PreparedStatement stmt;

stmt = con.prepareStatement();

Với một đối tượng PreparedStatement, bạn có thể chuẩn bị và thi hành các câu
lệnh SQL theo phương thức động. Bằng cách liên kết lại các giá trị tới các dấu
tham số trong các câu lệnh SQL, bạn có thể thi hành cùng một câu lệnh nhiều lần
bằng cách sử dụng các giá trị khác nhau. (Một dấu tham số được biểu diễn bằng
một dấu hỏi ?, và hoạt động như một ký hiệu giữ chỗ cho một giá trị sẽ được gán
trong thời gian chạy). Ví dụ:
pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE
ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();


Để biết thêm về các dấu tham số, đọc bài viết thứ tám trong loạt bài này (xem
phần Tài nguyên).


Đối tượng PreparedStatement: Mã mẫu
Ứng dụng dưới đây giải thích tất cả các khái niệm được thảo luận trong phần trên:
 Tạo một đối tượng PreparedStatement.
 Sử dụng dấu tham số để gán các giá trị trong các câu lệnh SQL theo
phương thức động.
Ứng dụng này phân tích một mảng các tên và chức danh công việc. Ứng với mỗi
mục trong mảng, nó chèn thêm một bản ghi vào bảng nhân viên.
//pStmtDb.java
import java.sql.*;

class pStmtDb
{
public static void main(String[] argv)
{
String url = "jdbc:db2:sample";
Connection con;
PreparedStatement pStmt;
Statement sStmt;
ResultSet rs;
String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB)
VALUES (?,?,99,?)";
String [][] staff =
{{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};

try

{
Class.forName("com.ibm.db2.jcc.DB2Driver");
con = DriverManager.getConnection(url);
con.setAutoCommit(false);

pStmt = con.prepareStatement(stmtString);

for (int i=0; i<3; i++) {
pStmt.setInt(1,401+i);
pStmt.setString(2,staff[i][0]);
pStmt.setString(3,staff[i][1]);
pStmt.executeUpdate();
}

con.commit();

sStmt = con.createStatement();
rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF
WHERE DEPT = 99");

×