SỬ DỤNG JDBC VỚI SERVLET
Trong chương này, chúng ta sẽ tìm hiểu cách truy cập cơ sở dữ liệu quan hệ từ chương trình Java.
7.1. CÀI ĐẶT JDBC DRIVER
Việc tương tác với các cơ sở dữ liệu quan hệ (ta gọi tắt là database) thường được thực hiện thông qua một API chuẩn gọi là Java Database Connectivity (JDBC). Các nhà cung cấp database thường cung cấp bản cài đặt JDBC API có thể làm việc được trên database mà họ cung cấp. Đứng từ góc độ của chương trình Java sử dụng JDBC, ta sẽ không thấy sự khác biệt nào giữa các database, bởi vì mọi chi tiết về việc giao tiếp với database đều bị ẩn đi ở bên trong thư viện cài đặt JDBC. Trong chương này, ta giả sử đang làm việc với MySQL. Đối với các hệ quản trị cơ sở dữ liệu khác, chúng ta sẽ tiến hành cài đặt tương tự. Chúng ta thực hiện các bước sau để cài đặt JDBC.
Bước 1: Download gói MySQL Connector/J tại website của MySQL.
Bước 2: Giải nén tập tin download được ở bước 1, sau đó copy tập tin .jar vào thư mục Project → Properties → Java Build Path → Libraries → Add External Jars... (nếu làm việc với Eclipse). Một cách khác là copy tập tin này vào thư mục lib bên trong ${TOMCAT_HOME} (dùng ký hiệu này để chỉ biến lưu trữ thư mục chứa TOMCAT). Lý do của việc copy file .jar đến thư mục này thay vì copy vào WEB-INF/lib của project là để sau này ta có thể cấu hình Tomcat sao cho nó có thể tạo và quản lý một database connection pool cho phép tất cả các ứng dụng web được cài đặt với Tomcat có thể sử dụng được pool này. Mặt khác, chúng ta cũng không cần truy cập JDBC driver ở thời điểm dịch chương trình (build time), nên không cần phải copy nó vào build path của project (chương trình chỉ truy cập JDBC driver ở lúc chạy). Vì vậy, ta cần đặt JDBC driver vào trong runtime classpath của Tomcat. Tập tin .jar MySQL Connector/J chứa phần cài đặt của giao diện JDBC, và chi tiết cài đặt hoàn toàn không thấy được từ chương trình, mà chỉ có thể được tham chiếu trong lúc chương trình chạy.
Lứu ý rằng việc dùng database connection pool là một good practice. Bởi vì nó cho phép loại bỏ chi phí thiết lập lại các kết nối đã bị bỏ đi. Trong khi ứng dụng web thường xử lý rất nhiều request từ nhiều client, và vì vậy thường xuyên phải kết nối đến database.
Hình 7.1 minh họa quan hệ giữa chương trình Java và các thành phần của JDBC.
Hình 7.1 - Chương trình Java và các thành phần của JDBC
7.2. CÁC BƯỚC LÀM VIỆC VỚI JDBC
Để truy cập database dùng JDBC, ta sử dụng driver url và driver class. Driver URL (connection url hoặc connection string) có định dạng tùy thuộc vào hệ quản trị cơ sở dữ liệu. Ví dụ, đối với MySQL, driver url có dạng:
jdbc:mysql://<HOST>:<PORT>/<DB>.
Đối với Oracle, driver url có dạng:
jdbc:oracle:thin:@<HOST>:<PORT>:<DB>.
Trong chương trình Java, ta cần thực hiện các bước sau để kết nối được với database dùng JDBC.
Bước 2: Import các lớp cần thiết.
import java.sql.Connection; // not
com.mysql.jdbc.Connection
import java.sql.DriverManager;
import java.sql.SQLException;
Bước 3: Đăng ký JDBC driver với DriverManager. Class.forName("com.mysql.jdbc.Driver").newInstance();
Bước 4: Gọi phương thức getConnection() để mở mới một connection. Connection con = DriverManager.getConnection("jdbc:mysql:///myDB", myUserName,myPassword); HOẶC Connection con = DriverManager.getConnection("jdbc:mysql:///myDB?user =dave&password=xxx")
Bước 5: Thực hiện việc truy xuất database.
Bước 6: Đóng connection.
connection.close();
Bảng 7.1 trình bày một chương trình đơn giản sử dụng JDBC.
Bảng 7.1 - Ví dụ cách dùng JDBC
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JdbcExample1 {
public static void main(String args[]) { Connection con = null;
try { Class.forName("com.mysql.jdbc.Driver").newInstance(); con = DriverManager.getConnection("jdbc:mysql:///test", "root", ”pswd"); if (!con.isClosed()) System.out.println("Successfully connected
to MySQL server..."); doQuery(con); } catch(Exception e) { System.err.println("Exception: " + e.getMessage()); } finally { try { if (con != null) con.close(); // Đóng connection } catch(SQLException e) {} } } }
int doQuey(Connection connection){ // Tạo statement
Statement statement =
connection.createStatement(); // Query string
String query = <SQLQuery>; // CRUD // for retrieve data
ResultSet result =
statement.executeQuery(query); while (result.next()){
result.getString(<ColName>); result.getInt(<ColName>); result.getFloat(<ColName>); }
// for data modification: insert, update, delete int nbUpdated = statement.executeUpdate(query); return nbUpdated;