Các bước cơ bản khi làm việc với JDBC
Trong quá trình xây dựng và phát triển ứng dụng, việc sử dụng 1 hệ quản trị cơ sở dữ liệu để lưu trữ thông tin và hỗ trợ cho quá trình xử lý của chương trình là điều rất cần thiết. Như vậy việc tạo, duy trì và thao tác trên 1 kết nối đến cơ sở dữ liệu dùng cho chương trình là hết sức quan trọng. Trong phạm vi của bài viết này, tôi muốn giới thiệu tới các bạn những bước cơ bản nhất cần phải nắm được khi làm việc với JDBC (Java Database Conectivity).
Với 1 chương trình viết bởi ngôn ngữ Java có sử dụng JDBC cho việc giao tiếp với cơ sở dữ liệu thì bạn phải thực hiện 5 bước như sau:
B1: Nạp trình điều khiển kết nối (Load Driver)
B2: Thiết lập kết nối đến cơ sở dữ liệu thông qua “Connection String” (Establish a database connection)
B3: Tạo và thực thi 1 câu lệnh truy vấn đến cơ sở dữ liệu (Create and execute an SQL Statement)
B4: Xử lý kết quả nhận về sau khi thi hành lệnh truy vấn thành công trên cơ sở dữ liệu (Process the results)
B5: Đóng kết nối và giải phóng tài nguyên đã dành cho kết nối đó (Close the database connection)
Bước 1: Nạp trình điều khiển kết nối (Load Driver)
Để tiến hành nạp trình điều khiển kết nối, bạn phải dùng phương thức forName của lớp Class để tạo ra 1 thể hiện của lớp kết nối dựa trên giao thức mà JDBC cung cấp. Cú pháp của lệnh này như sau
public static Class forName(String className) throws ClassNotFoundException
Ví dụ :
- Giả sử bạn muốn sử dụng kết nối theo kiểu 1 của JDBC (ODBC-JDBC Bridge) thì câu lệnh để load driver cho kiểu này có thể viết như sau
Class.forName("jdbc:odbc:JdbcOdbcDriver");
Ghi chú : Chuỗi "jdbc:odbc:JdbcOdbcDriver" dùng làm tham số của hàm chính là giao thức điều khiển dành cho kết nối loại 1 của JDBC
- Trong trường hợp khác, bạn muốn kết nối đến cơ sở dữ liệu bằng kiểu kết nối thứ 4 của JDBC đối với cơ sở dữ liệu SQL Server, ta có thể thực hiện như sau
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
Ghi chú : Trong tình huống này thì chuỗi “com.microsoft.sqlserver.jdbc.SQLServerDriver” dùng làm tham số của hàm chính là giao thức điều khiển dành cho kết nối loại 4 của JDBC đối với cơ sở dữ liệu SQL Server
Bước 2: Thiết lập kết nối đến cơ sở dữ liệu (Establish a database connection)
Để thực hiện bước thứ 2 này, bạn phải tạo 1 đối tượng của lớp Connection để nhận kết quả trả về của phương thức getConnection, đây là phương thức tĩnh của lớp DriverManager có nhiệm vụ kiểm tra xem trong thư viện đã được cài đặt của Java có trình điều khiển kết nối thích hợp ứng với chuỗi kết nối mà lập trình viên đã mô tả và truyền vào thông qua tham số của hàm hay không. Nếu thỏa mãn, 1 đối tượng thuộc lớp Connection sẽ trả về cho phép chương trình có thể thực hiện các tác động cần thiết xuống cơ sở dữ liệu tông qua đối tượng này (nếu không thành công, 1 đối tượng thuộc lớp SQLException sẽ trả ra cho nơi gọi nó để thông báo lý do tại sao không thể tạo được kết nối). Cú pháp được mô tả như sau.
public static Connection getConnection(String strConnect) throws SQLException
ví dụ:
- Bạn muốn kết nối đến Database có tên qlCuocHen đã tạo ra trong SQL Server thông qua tài khoản sa với mật khẩu là 123456 thông qua kiểu kết nối thứ nhất của JDBC. Câu lệnh có thể viết như sau
String strConnect = "jdbc:odbc:driver={SQL Server};Server=BODUA-D778EAB2E; Database =qlCuocHen; UserName=sa; Password=123456";
Connection cnObj = DriverManager.getConnection(strConnect);
Ghi chú : Cú pháp của chuỗi kết nối được mô tả như sau
"jdbc:odbc:driver={SQL Server};Server=<ServerName>; Database=<YourDB>;UserName=<dbUser>;Password=<***>"
Những phần nằm trong cặp dấu <> bạn phải thay thế cho phù hợp. Bạn có thể tham khảo bài "KẾT NỐI SQL SERVER KIỂU 1 : ODBC – JDBC BRIDGE" trong WebSite này
Tương tự, nếu sử dụng kiểu kết nối thứ nhất, bạn có thể sử dụng connection String theo cú pháp như sau
"dbc:sqlserver://<server_name>:<port>;databaseName=<YourDB>;user= <userName>; password=<pass>"
Bạn cũng có thể tham khảo bài "KẾT NỐI SQL SERVER KIỂU 4 : Native protocol" trong WebSite này
Bước 3: Tạo và thực thi 1 câu truy vấn dữ liệu dạng SQL (Create and Execute an SQL Statement)
Khi 1 kết nối đã được thiết lập đến Database thành công, để có thể tác động lên cơ sở dữ liệu thông qua connection đó thì bạn phải tạo ra 1 đối tượng để có thể thực thi các tác động lên cơ sở dữ liệu của chương trình thông qua các câu lệnh dạng SQL, đối tượng đó có thể là object của 1 trong 3 lớp sau :
Statement
PreparedStatement
CallableStatement
(Trong phạm vi bài viết này, tôi mô tả cho việc sử dụng đối tượng Statement, những đối tượng khác ta sẽ mô tả thông qua những bài viết khác)
Như vậy, sau khi thiết lập kết nối thành công, bạn phải tạo ra 1 đối tượng Statement để nhận về 1 thể hiện của lớp này thông qua phương thức createStatement() của đối tượng Connection đã thiết lập.
Cú pháp
public Statement createStatement() throws SQLException
VD:
Connection ketNoi = null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String Url="jdbc:odbc:driver={SQL Server};Server=BODUA-D778EAB2E; Database =qlCuocHen; UserName=sa; Password=123456";
ketNoi= DriverManager.getConnection(Url);
ResultSet kq=null;
Statement stCmd = this.ketNoi.createStatement();
Bước 4: Xử lý kết quả nhận về sau khi thi hành lệnh truy vấn thành công trên cơ sở dữ liệu (Process the results)
Một đối tượng của lớp Statement, sau khi tạo ra có thể thực thi 1 lệnh SQL tác động lên cơ sở dữ liệu thông qua phương thức executeQuery() (hay executeUpdate() – thường dùng khi cần thực hiện các câu lệnh SQL dạng DDL: Data Definition Language). Kết quả trả về khi thực thi lệnh executeQuery sẽ là 1 đối tượng của lớp ResultSet chứa thông tin là kết quả truy vấn được từ cơ sở dữ liệu. Cú pháp của lệnh này như sau:
public ResultSet executeQuery(String strQuery) throws SQLException
Với 1 đối tượng ResultSet, bạn có thể sử dụng các phương thức tiêu biểu để thao tác đối với dữ liệu, hay điều khiển đối tượng này như sau
.next() – cho phép dịch chuyển con trỏ sang mẫu tin kết tiếp để truy xuất dữ liệu
.getString(tenCot) – Cho phép bạn đọc thông tin của 1 trường thông tin dạng chuỗi có trong kết quả trả về của ResultSet. Tương tự đối với các kết quả dạng khác của các kiểu thuộc dạng Primitive data type như : int, boolean, byte, long, float, double …
Các phương thức tương ứng có thể lần lượt là : .getInt(tenCot); .getBoolean(tenCot); .getByte(tenCot); .getLong(tenCot); .getFloat(tenCot); .getDouble(tenCot)… Các hàm này thường overload 2 dạng, dạng thứ nhất sử dụng tham số kiểu chuỗi chỉ ra tên của cột chứa thông tin muốn đọc, dạng thứ 2 kiểu int mô tả cho chỉ số của cột muốn đọc.
VD:
Giả sử sau khi đã tạo kết nối thành công, ta tạo 1 đối tượng của lớp Statement và đọc dữ liệu của bảng chứa thông tin là tên của các thành viên có trong dsNguoiQuen của database qlCuocHen, với các thông tin cần đọc về bao gồm các fields : hoNQ, tenNQ, gioiTinh, tuoiNQ. Ta sẽ làm như sau
Statement stCmd = ketNoi.createStatement();
String strQuery= "Select hoNQ, tenNQ, gioiTinh, tuoiNQ from dsNguoiQuen;";
ResultSet kq = stCmd.executeQuery(strQuery);
//– Lặp trong khi còn đọc được dữ liệu trong ResultSet
While (kq.next()){
System.out.print(“ Họ và tên :”+kq.getString(“hoNQ”)+“ ”+kq.getString(“tenNQ”);
System.out.print(“Giới tính :”+(kq.getBoolean(“gioiTinh”)?”Nam”:”Nữ”));
System.out.println(“Hiện nay : “+kq.getInt(“tuoiNQ”).toString()+” Tuổi”);
}
Hoặc ta có thể truy xuất đến chỉ số của cột như sau
//– Lặp trong khi còn đọc được dữ liệu trong ResultSet
While (kq.next()){
System.out.print(“ Họ và tên :”+kq.getString(1)+“ ”+kq.getString(2);
System.out.print(“Giới tính :”+(kq.getBoolean(3)?”Nam”:”Nữ”));
System.out.println(“Hiện nay : “+kq.getInt(4).toString()+” Tuổi”);
}
Bước 5: Đóng kết nối và giải phóng tài nguyên (Close the database connection)
Đây là bước đơn giản nhất và cũng là bước khá quan trọng trong 5 bước. Hãy tưởng tượng chương trình của bạn trong quá trình làm việc có thể phải tạo ra rất nhiều kết nối mỗi khi cần tác động lên cơ sở dữ liệu, tại mỗi thời điểm 1 kết nối được tạo ra, JVM phải cấp phát 1 vùng nhớ để quản lý và cho phép đối tượng kết nối này làm việc. Cũng cùng thời điểm đó, tại Database server, ứng với 1 connection cũng sẽ được tạo và được cấp phát 1 vùng nhớ riêng. Nếu sau mỗi lần làm việc với kết nối xong, bạn không thực hiện giải phóng tài nguyên thì đến 1 lúc nào đó database server sẽ chẳng còn đủ bộ nhớ để cấp phát cho 1 kết nối mới nữa và như thế chương trình của chúng ta cũng có thể đồng nghĩa việc không thể hoạt động được nữa do bị gián đoạn với nguồn cung cấp dữ liệu dành cho nó. Hãy nhớ đóng kết nối sau khi đã làm việc xong là điều vô cùng quan trọng và cần thiết
Cú pháp
public void close() throws SQLException
Chạy thử chương trình này xem đã kết nối được chưa.
Code:
import java.sql.*;
public class Connect{
public static void main (String[] args){
Connection con = null;
try{
String userName = “sa”;
String password = “123456”;
String url = “jdbc:sqlserver://localhost:1433;databaseName=J2EE1_Demo;”;
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
con = java.sql.DriverManager.getConnection(url,userName,password);
System.out.println (“Da ket noi CSDL”);
}
catch (Exception e){
System.err.println(“Khong ket noi duoc do: ” + e.getMessage() );
}
finally{
if (con != null){
try{
con.close ();
System.out.println (“Dong ket noi”);
}
catch (Exception e) {}
}
}
}
}
Kết quả kết nối được là:
Code:
run:
Da ket noi CSDL
Dong ket noi
BUILD SUCCESSFUL (total time: 0 seconds)