Nhập môn Java với JDBC và MySQL (phần 1)

http://dc307.4shared.com/doc/7mnPduW6/preview.html

JDBC là gì?

    JDBC là viết tắt của “Java DataBase Connectivity”. Nó là một API (Application Programming Interface) có chứa một tập hợp các lớp, các giao diện Java và các thông báo lỗi ngoại lệ nằm trong cùng một đặc tả mà theo đó cả các công ty sản xuất JDBC driver cũng như các nhà phát triển JDBC đều phải tuân thủ chặt chẽ khi phát triển ứng dụng.

 

JDBC là một chuẩn truy xuất cơ sở dữ liệu rất phổ biến. Các RDBMS (Relational Database Management Systems – Hệ quản trị cơ sở dữ liệu quan hệ) hay các nhà sản xuất phần mềm bên thứ ba phát triển các driver cho Java đều cần tuân thủ chặt chẽ đặc tả JDBC. Các nhà phát triển khác sử dụng các driver này để phát triển nên các ứng dụng có truy cập cơ sở dữ liệu

Ai phát triển đặc tả JDBC?

SUN chuẩn bị và duy trì đặc tả JDBC. Bởi JDBC chỉ là một đặc tả (đề xuất cách viết và sử dụng các JDBC driver), nên các công ty sản xuất phần mềm bên thứ ba sẽ phát triển các JDBC driver tuân thủ chặt chẽ đặc tả này. Các nhà phát triển JDBC sau đó sẽ sử dụng các driver này để truy cập vào các nguồn dữ liệu.

Tại sao lại dùng JDBC?

JDBC tồn tại là để giúp các nhà phát triển Java tạo nên các ứng dụng truy xuất cơ sở dữ liệu mà không cần phải học và sử dụng các API độc quyền do các công ty sản xuất phần mềm khác nhau bên thứ ba cung cấp. Bạn chỉ cần học JDBC và sau đó bạn sẽ được đảm bảo rằngbạn sẽ có thể phát triển nên các ứng dụng truy cập cơ sở dữ liệu có khả năng truy cập đến các RDBMS khác nhau bằng cách sử dụng các JDBC driver khác nhau.

Kiến trúc JDBC

Trong Java có 2 lớp chủ yếu chịu trách nhiệm về thiết lập kết nối đến một cơ sở dữ liệu.

    1. DriverManagerNạp các JDBC driver vào trong bộ nhớ. Có thể sử dụng nó để mở các kết nối tới một nguồn dữ liệu.

    2. ConnectionBiểu thị một kết nối đến một nguồn dữ liệu. Được dùng để tạo ra các đối tượng Statement, PreparedStatement và CallableStatement.
Statement – Biểu diễn một lệnh SQL tĩnh. Có thể sử dụng nó để thu về đối tượng ResultSet.

    3. PreparedStatement – Một giải pháp thay thế hoạt động tốt hơn đối tượng Statement, thực thi một câu lệnh SQL đã được biên dịch trước.

    4. CallableStatement– biểu diễn một thủ tục được lưu trữ. Có thể được sử dụng để thực thi các thủ tục được lưu trữ trong một RDBMS có hỗ trợ chúng.

    5. ResultSet– biểu diễn một tập kết quả trong cơ sở dữ liệu tạo ra bởi việc sử dụng một câu lệnh SQL là SELECT.

    6. SQLException– một lớp xử lý lỗi ngoại lệ chứa các lỗi truy cập cơ sở dữ liệu.

Gói thứ hai, javax.sql là một bộ phận của J2SE 1.4 và J2EE 1.3. Nó bổ sung các tính năng sau đây vào JDBC để hỗ trợ thêm cho các tính năng đã có trong gói java.sql:

    7. DataSource – Trừu tượng hóa một nguồn dữ liệu. Đối tượng này có thể sử dụng thế cho

    8. DriverManagerđể tạo ra một cách có hiệu quả các kết nối cơ sở dữ liệu (có khả năng sử dụng việc chứa/phân chia các đường kết nối ngầm).
Tạo sẵn cơ chế phân chia đường kết nối (built-in connection pooling).

    9. XADataSource, XAConnection– Cho phép/Hỗ trợ các giao dịch phân phối.
RowSet – Nó mở rộng giao diện ResultSet để tăng thêm sự hỗ trợ đối với các tập kết nối bị ngắt.

Có 4 loại JDBC driver. Thông dụng nhất và cũng là hiệu quả nhất là loại 4. Sau đây là mô tả:

    JDBC Driver loại 1– Chúng là các trình điều khiển cầu nối JDBC-ODBC. Chúng ủy nhiệm công việc truy cập dữ liệu cho ODBC API. Chúng là trình điều khiển chậm nhất trong số còn lại. SUN cung cấp một phần mềm trình điều khiển JDBC/ODBC.

    JDBC Driver loại 2 – Chúng chủ yếu sử dụng API mã nền để truy cập dữ liệu và cung cấp các lớp bao Java để có thể được gọi ra bằng cách dùng các JDBC driver.

    JDBC Driver loại 3 – Chúng được viết thuần bằng Java và sử dụng giao thức Net độc lập nhà sản xuất để truy cập đến trình theo dõi từ xa độc lập nhà sản xuất. Trình theo dõi này đến lượt nó lại ánh xạ các lời gọi độc lập nhà sản xuất này vào các lời gọi phụ thuộc nhà sản xuất. Bước đặc biệt này đã làm tăng độ phức tạp và giảm tính hiệu quả trong truy cập cơ sở dữ liệu.

    JDBC Driver loại 4 – Chúng được viết thuần túy bằng Java và là loại hiệu quả nhất. Chúng cho phép kết nối trực tiếp vào cơ sở dữ liệu, cung cấp kết quả tối ưu và cho phép lập trình viên thực hiện các chức năng tùy thuộc vào cơ sở dữ liệu cụ thể. Điều này đã tạo ra tính cơ động cao nhất là khi bạn cần thay đổi cơ sở dữ liệu bên dưới một ứng dụng. Loại driver này thường được dùng cho các ứng dụng phân tán cao.
SUN khuyến cáo sử dụng và phát triển các trình điều khiển loại 4 trong các ứng dụng .

Cài đặt MySQL
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng. MySQL miễn phí hoàn toàn nên bạn có thể tải về MySQL từ trang chủ www.mysql.com.

MySQL có nhiều phiên bản cho các hệ điều hành khác nhau: phiên bản Win32 cho các hệ điều hành dòng Windows, Linux, Mac OSX… Cài đặt Connector/J – JDBC Driver của MySQL JDBC Driver của MySQL có thể lấy về ở địa chỉ http://www.mysql.com/downloads/api-jdbc.html .

File bạn tải về sẽ là một file .zip hoặc .gz. Sau khi giải nén bạn sẽ có 1 file có tên tương tự như sau:mysql-connectorjava- 3.0.9-stable-bin.jar. Hãy chép file này vào thư mục %JAVA_HOME%/jre/lib/ext trên hệ thống của bạn. Ví dụ C:\j2sdk1.4.2\jre\lib\ext.
Bạn cũng cần đưa đường dẫn đến file JAR này vào biến môi trường MYSQL_DRIVER của bạn.

 

Sau khi bạn đã đặt đường dẫn đến Connector/J vào biến môi trường MYSQL_DRIVER thì bạn đã có thể yên tâm là JDBC driver của MySQL đã được cài đặt xong.
Kiểm tra xem Connector/J đã hoạt động chưa?
Chúng ta tạo ra một chương trình Java nhỏ để kiểm tra xem chúng ta đã cài đặt đúng JDBC driver của MySQL chưa. Nếu chương trình chạy thành công thì nghĩa là trình điều khiển JDBC đã sẵn sàng cho các tác vụ phức tạp hơn. Bạn hãy tạo ra một file Connect.java với đoạn mã sau:

import java.sql.*;
public class Connect{
public static void main (String[] args){

Connection conn = null;
try{
String userName = “root”;
String password = “localhost”;
String url = “jdbc:mysql://127.0.0.1:3306/mysql”;
Class.forName (“com.mysql.jdbc.Driver”).newInstance ();

conn = DriverManager.getConnection (url,userName, password);
System.out.println (“Da ket noi CSDL”);
}
catch (Exception e){
System.err.println (“KHONG KET NOI DUOC”);
}
finally{
if (conn != null){
try{
conn.close ();
System.out.println (“Dong ket noi”);
}
catch (Exception e) { /* bo qua loi luc dong csdl */ }
}
}
}
}
Trước hết bạn hãy biên dịch file này ra mã bytecode nhưng để chạy nó, bạn cần chú ý đảm bảo MySQL đang chạy trên máy tính cá nhân của bạn. Nếu bạn đã cài đặt MySQL để nó chỉ chạy khi bạn gọi thì bạn hãy bật MySQL với câu lệnh mysqld-nt –console hay nếu bạn đã cài chương trình quản trị cơ sở dữ liệu này dưới hình thức một dịch vụ thì bạn có thể gõ net start mysql trong shell Run trong Windows.

Đoạn mã trên sử dụng cặp tên người sử dụng và mật khẩu là root/localhost với cơ sở dữ liệu là mysql. Nếu kết nối thành công, bạn sẽ thấy một màn hình như dưới đây xuất hiện.

 

Chương trình trên sử dụng TCP/IP để kết nối vào hệ cơ sở dữ liệu MySQL.

* Phân tích

Để kết nối và sử dụng một cơ sở dữ liệu từ Java applet, servlet hay ứng dụng Java thì chúng ta cần thực hiện qua 3 bước:

1. Đăng kí/Nạp (các) driver

2. Thiết lập kết nối đến cơ sở dữ liệu

3. Gửi câu lệnh SQL và xử lý kết quả thu về

Bước đầu tiên để tạo ra một kết nối giữa ứng dụng Java và một cơ sở dữ liệu là đăng kí một JDBC driver với máy ảo Java (JVM) mà ứng dụng Java chạy trên đó. Với cơ chế kết nối truyền thống (sẽ nói trong phần cơ chế kết nối DataSource, thảo luận sau), thì kết nối và tất cả các hình thức giao tiếp với cơ sở dữ liệu đều do đối tượng DriverManager kiểm soát. Để thiết lập một đường kết nối, một JDBC driver thích hợp dùng cho cơ sở dữ liệu mục tiêu phải được đăng kí với đối tượng DriverManager.

Đặc tả JDBC chỉ ra rằng các JDBC driver được xem là sẽ tự đăng kí với đối tượng DriverManager một cách tự động khi chúng được nạp vào một JVM. Ví dụ đoạn mã sau sử dụng một bộ khởi tạo tĩnh để lần đầu tiên tạo ra một mẫu của JDBC driver mang tên persistentjava và sau đó đăng kí nó với DriverManager.

static {
java.sql.DriverManager.registerDriver(new
com.persistentjava.JdbcDriver()) ;
}

Việc đăng kí một driver đơn giản chỉ là việc nạp lớp driver vào JVM. Chúng ta có thể làm điều đó bằng một số cách khác nhau. Một trong những cách đó là thông qua

ClassLoader Class.forName(com.persistentjava.JdbcDriver) ;.

Một cách khác, không phổ biến lắm là dùng thuộc tính hệ thống jdbc.drivers. Chúng ta có thể dùng cách này theo 3 hình thức khác nhau:

Từ dòng lệnh:java -Djdb.drivers =com.persistentjava.JdbcDriver Connect

* Bên trong ứng dụng java:

System.setProperty(“jdbc.drivers”, “com.persistentjava.JdbcDriver”) ;

* Bằng cách thiết lập thuộc tính jdbc.drivers vào file thuộc tính hệ thống, nhưng nhìn chung là lại tùy thuộc vào hệ thống Bằng phương pháp tách các driver bằng một dấu phẩy, chúng ta có thể đăng kí nhiều driver thông qua kĩ thuật thuộc tính hệ thống ở trên. Một trong các lợi ích của kĩ thuật này là ở chỗ các driver có thể đưa vào và ra khỏi JVM mà không cần thay đổi mã (hoặc chỉ cần thay đổi ở mức tối thiểu). Nếu đăng kí nhiều driver, thứ tự ưu tiên của chúng như sau:

1) Các JDBC driver do thuộc tính jdbc.drivers đăng kí lúc khởi tạo JVM, và

2)Các JDBC driver được nạp động. Do thuộc tính jdbc. drivers chỉ được kiểm tra một lần vào lần gọi đầu tiên của phương thức DriverManager(), nên quan trọng là bạn phải đảm bảo rằng tất cả các driver được đăng kí đúng trước khi thiết lập kết nối.
Chú ý là có một số JVMs không tuân thủ đặc tả JVM và kết quả là các bộ khởi tạo tĩnh không phải lúc nào cũng làm việc thống nhất như mong muốn. Điều này dẫn tới việc có nhiều cách đăng kí một JDBC driver:

· Class.forName(“com.persistentjava. JdbcDriver”).newInstance() ;
· DriverManager.registerDriver(new com.persistentjava.JdbcDriver()) ;

Hai cách trên thường hoạt động tốt trong tất cả các JVM nên bạn có thể sử dụng chúng một cách thoải mái. Nhưng điều khác biệt là Class.forName() có thể chặn bắt một ClassNotFoundException, nên bạn cần bao mã đăng kí driver vào một bộ xử lý lỗi ngoại lệ thích hợp.
Ví dụ:

try{
Class.forName (“com.mysql.jdbc.Driver”).newInstance ();
}
catch (Exception e){
System.err.println (“KHONG KET NOI DUOC”);
}
Các sách về MySQL khuyến cáo bạn nên dùng cách trên. Phương thức Class.forname() nhận một chuỗi làm đối số. Trong trường hợp bạn dùng JDBC Driver của hãng MySQL AB cho MySQL bản 4.0 trở lên thì chuỗi đó là:

com.mysql.jdbc.Driver

Cần chú ý là bạn không cần phải tạo ra một mẫu của driver và đăng kí nó với DriverManager vì việc gọi Class.forName() sẽ làm cho bạn điều đó một cách tự động.
Bước tiếp theo sau khi bạn đã đăng kí JDBC Driver là thực hiện kết nối. Toàn bộ công đoạn này được minh họa qua dòng mã sau:

Connection conn = DriverManager.getConnection(url, “myLogin”, “myPassword”);

Cách khác:
Connection conn;
conn = DriverManager.getConnection(url, “myLogin”, “myPassword”);

Đoạn mã trên rất tường minh. Phương thức getConnection() được gọi để thực hiện một kết nối thực sự đến phần mềm máy chủ cơ sở dữ liệu. Lớp DriverManager tạo ra một đối tượng Connection khi bạn gọi phương thức getConnection(). Phương thức này nhận một chuỗi URL làm đối số. Ví dụ, với MySQL thì chuỗi đó có thể là:

jdbc:mysql://127.0.0.1:3306/mysql hoặc jdbc:mysql://localhost/mydatabase

Chuỗi này tuân theo quy tắc sau đây: jdbc:<subprotocol>:<subname> trong đó:
<subprotocol> thường là driver hoặc cơ chế kết nối cơ sở dữ liệu

<subname> phụ thuộc vào <subprotocol>, có thể thay đổi theo các nhà cung cấp driver mà nó có thể là mysql, db2, oracle hay odbc.
<subname> có thể chứa địa chỉ Internet cho các cơ sở dữ liệu ở xa. Phần này có thể gồm có tên host, mã số cổng, và tên của hệ thống cơ sở dữ liệu.

Chú ý là trong một số sách khác, công thức trên còn trình bày dưới dạng: jdbc:sub-protocol:database locator tuy về bản chất thì không có gì thay đổi.

Nếu một trong các driver mà bạn cung cấp nhận ra địa chỉ JDBC URL mà bạn cung cấp cho phương thức DriverManager.getConnection, thì driver đó sẽ thiết lập đường kết nối đến MySQL xác định trong JDBC URL.

Lớp DriverManager sẽ quản lý tất cả các chi tiết của việc thiết lập đường kết nối bên dưới nên bạn không cần phải quan tâm gì thêm.

Đường kết nối do phương thức DriverManager.getConnection trả về là một đường kết nối mở mà bạn có thể sử dụng để thông qua các lệnh JDBC nhằm gửi các lệnh SQL tới MySQL. Ở đây chúng ta có đối tượng conn chứa kết nối mở và chúng ta sẽ sử dụng chúng để thực hiện các ví dụ thao tác trên MySQL.

Nhập môn Java với JDBC và MySQL – Phần 2 Trong bài trước, chúng ta đã làm quen với một số khái niệm cơ bản về MySQL và JDBC trong Java. Chúng ta cũng đã học cách tạo ra một đoạn mã cho phép thực hiện kết nối đến hệ quản trị cơ sở dữ liệu MySQL. Trong bài này, chúng ta sẽ cùng nhau tìm hiểu một số cách thức truy vấn dữ liệu thông qua JDBC.

Thực hiện các câu truy vấn

Để thực hiện câu lệnh SQL trong một ứng dụng có sử dụng JDBC, bạn hãy tạo ra một đối tượng Statement từ đối tượng Connection của bạn. Đối tượng này chứa một kết nối đơn đến cơ sở dữ liệu. Các đối tượng Statement hỗ trợ phương thức executeUpdate() để đưa vào các câu truy vấn thực hiện chức năng thay đổi cơ sở dữ liệu và không trả lại tập kết quả, và phương thức executeQuery() để tạo ra các câu truy vấn cho phép trả lại tập kết quả. Để minh họa kết quả xử lý dữ liệu chúng ta sử dụng một bảng, animal, bảng này hứa 1 cột id chứa số nguyên và 2 cột chứa các chuỗi, name và category. Câu lệnh MySQL để tạo bảng này trông như sau:

CREATE TABLE animal(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),

name CHAR(40),

category CHAR(40)
)

Cột id có thuộc tính AUTO_INCREMENT tức là giá
trị của nó tự động tăng thêm mà không cần chúng ta
trực tiếp can thiệp, vì MySQL tự động gán các giá trị
nối tiếp nhau 1, 2, 3, … mỗi khi có 1 bản ghi được bổ
sung vào bảng.

——Thực hiện câu truy vấn không trả lại tập kết quả

Đầu tiên chúng ta tạo ra một đối tượng Statement từ đối tượng Connection, và sau đó sử dụng chúng để tạo ra và cung cấp giá trị cho bảng animal. DROP TABLE, CREATE TABLE, UPDATE, DELETE và INSERT đều là các câu lệnh thực hiện việc thay đổi cơ sở dữ liệu, cho nên phương thức executeUpdate() là phương thức thích hợp để thực thi chúng. Phương thức này trả lại một số nguyên chỉ số lượng hàng trong cơ sở dữ liệu đã bị tác động sau khi thực hiện câu truy vấn. Trong ví dụ dưới đây, số nguyên này đã được gán vào biến count:

Statement s = conn.createStatement ();
int count;
s.executeUpdate (“DROP TABLE IF EXISTS animal”);
s.executeUpdate ( “CREATE TABLE animal (“ + “id INT UNSIGNED NOT NULL AUTO_INCREMENT,”
+ “PRIMARY KEY (id),”
+ “name CHAR(40), category CHAR(40))”);
count = s.executeUpdate (“INSERT INTO animal (name, category)”
+ “ VALUES”
+ “(‘snake’, ‘reptile’),”
+ “(‘frog’, ‘amphibian’),”
+ “(‘tuna’, ‘fish’),”
+ “(‘racoon’, ‘mammal’)”);
s.close();
System.out.println (count + “ dong da duoc tao ra”);

Ở đây, biến count được sử dụng để báo lại số lượng hàng mà câu lệnh INSERT đã bổ sung vào bảng animal.

Một đối tượng Statement có thể sử dụng để tạo ra nhiều câu truy vấn. Khi đã thực hiện xong các thao tác trên cơ sở dữ liệu, bạn hãy gọi phương thức close()để xóa đối tượng và giải phóng tất cả các tài nguyên liên kết đến nó.

Nếu như bạn muốn biết câu lệnh SQL có trả lại tập kết quả hay không (ví dụ như khi người sử dụng nhập câu lệnh vào trường nhập liệu của form), thì bạn có thể dùng phương thức execute() của đối tượng Statement. Phương thức này trả lại true nếu câu lệnh có trả lại tập kết quả. Trong trường hợp đó, đối tượng ResultSet có thể được thu hồi thông qua phương thức getResultSet() và số lượng hàng được tác động có thể biết được thông qua phương thức getUpdateCount():

Statement unknownSQL = con.createStatement();
if(unknownSQL.execute(sqlString)) {
ResultSet rs = unknownSQL.getResultSet();
// hiển thị kết quả
}
else {
System.out.println(“Cac dong da cap nhat: “ + unknownSQL.getUpdateCount());
}

————Thực thi các câu truy vấn có trả lại một tập kết quả

Các câu lệnh truy vấn có trả lại tập kết quả là các câu lệnh giúp chúng ta lấy ra dữ liệu từ cơ sở dữ liệu dưới một dạng thức nào đó. Ví dụ câu lệnh SELECT lấy thông tin từ một cơ sở dữ liệu về thì khi đó ta dùng phương thức executeQuery(). Sau khi gọi phương thức này, bạn hãy tạo ra một đối tượng ResultSet và sử dụng nó để lặp lại các thao tác dữ liệu trên các hàng mà câu truy vấn trả về. Ví dụ sau cho thấy cách sử dụng phương thức này để lấy thông tin từ bảng animal về:

Statement s = conn.createStatement ();
s.executeQuery (“SELECT id, name, category FROM animal”);
ResultSet rs = s.getResultSet ();
int count = 0;
while (rs.next ()){
int idVal = rs.getInt (“id”);
String nameVal = rs.getString (“name”);
String catVal = rs.getString (“category”);
System.out.println ( “id = “ + idVal + “, name = “ + nameVal + “, category = “ + catVal);
++count;
}
rs.close ();
s.close ();
System.out.println (count + “ dong duoc thu ve”);

Phương thức executeQuery() không trả lại số nguyên đếm số hàng mà nó tác động, do vậy nếu bạn muốn biết một tập kết quả chứa bao nhiêu hàng thì bạn cần tự mình đếm lấy khi bạn thực thi thao tác lấy dữ liệu trên từng hàng. Để lấy được các giá trị của cột trên từng hàng, thì bạn hãy gọi các phương thức getXXX(),trong đó XXX đại diện cho kiểu giá trị của cột. Chẳng hạn, các phương thức getInt()getString() được sử dụng trong ví dụ trên trả lại các giá trị chuỗi và số nguyên. Như đã trình bày, các phương thức này có thể được gọi bằng cách sử dụng tên của một cột nằm trong tập kết quả. Bạn cũng có thể lấy các giá trị về từ vị trí của chúng. Đối với tập kết quả lấy về từ câu truy vấn SELECT trong ví dụ trên, id, name, và category nằm ở các vị trí cột 1, 2 và 3 và do vậy có thể lấy về theo cách sau:

int idVal = rs.getInt (1);

String nameVal = rs.getString (2);

String catVal = rs.getString (3);

Các đối tượng ResultSet, cũng như các đối tượng Statement, nên được đóng lại khi bạn đã dùng xong chúng. Để kiểm tra xem liệu giá trị của một cột nào đó có là NULL hay không, bạn hãy gọi phương thức wasNull() của đối tượng chứa tập kết quả sau khi lấy giá trị đó về. Ví dụ, bạn có thể kiểm tra giá trí NULL nằm trong cột name như sau:

String nameVal = rs.getString (“name”);
if (rs.wasNull ())
nameVal = “(khong ten)”;

Sử dụng thành phần giữ chỗ (Placeholders)

Thỉnh thoảng bạn cần xây dựng một câu truy vấn với các giá trị có chứa các kí tự cần được xử lý đặc biệt. Ví dụ, trong các câu truy vấn, các giá trị dạng chuỗi được viết bên trong các dấu trích dẫn đơn, nhưng bất cứ kí tự trích dẫn đơn nào nằm trong chính chuỗi đó đều cần phải được biến thành dấu trích dẫn kép hoặc phải được chuyển vị (escaped) bằng kí tự ‘\’ để tránh tạo ra các câu SQL hoạt động sai mục đích. Trong trường hợp này, cách dễ dàng hơn cả là bạn hãy để JDBC xử lý vấn đề chuyển vị này cho bạn, chứ không nên tự mình làm lấy. Để làm được điều đó, bạn hãy tạo ra một kiểu lệnh khác (một lệnh PreparedStatement), tham chiếu đến các giá trị dữ liệu nằm trong chuỗi truy vấn dưới hình thức các kí tự giữ chỗ. Sau đó báo cho JDBC biết để liên kết các giá trị dữ liệu đó vào các kí tự giữ chỗ này và nó sẽ xử lý một cách tự động bất cứ một kí tự đặc biệt nào. Giả sử bạn có hai biến có tên là nameVal và catVal dùng để chứa các giá trị sẽ chèn vào trong bảng animal. Để làm được điều đó mà không cần quan tâm đến việc liệu các biến đó có chứa các kí tự đặc biệt hay không, bạn hãy tạo ra một câu truy vấn kiểu như thế này:

PreparedStatement s;
s = conn.prepareStatement ( “INSERT INTO animal (name, category) VALUES(?,?)”);
s.setString (1, nameVal);
s.setString (2, catVal);
int count = s.executeUpdate ();
s.close ();
System.out.println (count + “ dong da duoc chen”);

Các kí tự ‘?’ nằm trong chuỗi truy vấn đóng vai trò là các kí tự giữ chỗ–các kí tự đánh dấu đặc biệt nhằm xác định nơi các giá trị dữ liệu cần được đặt vào đó. Phương thức setString() nhận thông tin về vị trí của kí tự giữ chỗ và một giá trị dạng chuỗi rồi gắn kết giá trị đó vào kí tự giữ chỗ thích hợp, thực thi bất cứ thao tác chuyển vị nào cần thiết. Phương thức mà bạn sử dụng để gắn kết một giá trị tùy thuộc vào kiểu dữ liệu. Ví dụ, setString() gắn giá trị dạng chuỗi và setInt() gắn các giá trị dạng số nguyên.

—-Xử lý lỗi

Nếu bạn muốn bẫy lỗi, hãy thực thi các thao tác JDBC bên trong khối try và sử dụng một bộ xử lý lỗi ngoại lệ để hiển thị thông tin về nguyên nhân gây ra vấn đề có thể xuất hiện. JDBC cung cấp các phương thức getMessage()getErrorCode() mà khi lỗi xuất hiện bạn có thể sử dụng để biết được thông báo lỗi và mã lỗi dạng số. Ví dụ sau cố tình dùng một câu truy vấn mắc lỗi. Khi thực thi, phương thức executeQuery() sẽ không thể xử lý được và phát sinh một lỗi ngoại lệ. Lỗi này sẽ được thu về thông qua khối catch, trong khối này bạn có thể chứa mã lệnh để xử lý lỗi hay chỉ đơn giản là hiển thị thông báo lỗi và mã lỗi:


try{
Statement s = conn.createStatement ();
s.executeQuery(“XYZ”); // tạo ra câu truy vấn không hợp lệ
s.close();
}
catch(SQLException e){
System.err.println (“Thong bao loi: “ + e.getMessage());
System.err.println (“Ma loi: “ +\e.getErrorCode());
}

 

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s