Kết nối JDBC với cơ sở dữ liệu




Chương này, chúng ta cùng tìm hiểu các bước chung để thiết lập một kết nối JDBC với một Database nào đó. Trong hai chương tiếp theo, chúng ta sẽ tìm hiểu chi tiết về cách kết nối với Oracle Database và MySQL.

Bước 1: Import các package

Bạn thêm lệnh import trong chương trình Java để bao các lớp cần thiết.

Bước 2: Đăng ký JDBC driver. Bạn có thể tìm hiểu cách import lib trong Java bởi link sau vietjack.com/java_jdbc/cach_them_file_jar_lib_trong_java.jsp

Bước này làm JVM tải trình triển khai driver cụ thể vào trong bộ nhớ để nó có thể thực hiện các yêu cầu JDBC của bạn.

Bước 3: Tạo địa chỉ Database URL chính xác

Bước này rất quan trọng và thường xuất hiện khá nhiều lỗi trong khi bạn tạo một địa chỉ thích hợp để trỏ tới Database mà bạn muốn kết nối.

Bước 4: Tạo đối tượng Connection

Bạn gọi phương thức getConnection() của đối tượng DriverManager để thành lập kết nối tới cơ sở dữ liệu thực sự.

Phần dưới đây trình bày chi tiết về các bước trên.

Bước 1: Import các JDBC package

Lệnh import nói cho Java Compiler nơi để tìm các lớp mà bạn muốn tham chiếu trong code và lệnh này được đặt ở phần đầu tiên của code.

Để sử dụng JDBC package chuẩn để cho phép bạn chọn, cập nhật và xóa dữ liệu trong các bảng SQL, bạn thêm các dòng sau:

import java.sql.* ;  // cho cac chuong trinh JDBC chuan
import java.math.* ; // de ho tro BigDecimal va BigInteger
Loading...

Bước 2: Đăng ký JDBC driver

Trước khi sử dụng bất kỳ driver nào, bạn cần đăng ký nó. Trong chương trình, bạn chỉ cần thực hiện một lần tiến trình đăng ký này, theo một trong hai cách sau:

Sử dụng phương thức Class.forName()

Sử dụng phương thức Class.forName() là hướng tiếp cận chung và phổ biến để đăng ký một driver. Dưới đây là cú pháp:

public static void Class.forName(String ten_lop) throws ClassNotFoundException  

Ví dụ, để đăng ký Oracle driver, bạn sử dụng mẫu sau:

try {
   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: khong the tai lop Driver!");
   System.exit(1);
catch(IllegalAccessException ex) {
   System.out.println("Error: xuat hien van de truy cap trong khi tai!");
   System.exit(2);
catch(InstantiationException ex) {
   System.out.println("Error: khong the khoi tao Driver!");
   System.exit(3);
}

Sử dụng DriverManager.registerDriver()

Nếu bạn đang sử dụng một JDK không tuân theo JVM (được cung cấp bởi Microsoft chẳng hạn), thì bạn nên sử dụng phương thức DriverManager.registerDriver() này. Ví dụ:

try {
   Driver myDriver = new oracle.jdbc.driver.OracleDriver();
   DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: khong the tai lop Driver!");
   System.exit(1);
}

Bước 3: Tạo địa chỉ Database URL chính xác

Đây là địa chỉ trỏ tới cơ sở dữ liệu của bạn. Việc tạo một địa chỉ Database URL chính xác là rất quan trọng, và đây thường là bước hay xuất hiện lỗi trong khi thành lập một kết nối. Bảng dưới đây liệt kê một số tên JDBC driver và Database URL phổ biến:

Trong đó, hostname là tên server mà cơ sở dữ liệu đang chạy (có thể là localhost hoặc địa chỉ IP của bạn); port Number là số hiệu cổng và databaseName là tên của cơ sở dữ liệu.

RDBMS Tên JDBC Driver Định dạng URL
MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/ databaseName
ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port Number:databaseName
DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:port Number/databaseName
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname: port Number/databaseName

Phần in đậm là phần bạn không nên thay đổi, bạn chỉ cần thay đổi phần còn lại theo yêu cầu của bạn.

Bước 4: Tạo đối tượng Connection

Sau khi đã tải driver, bạn có thể thiết lập một kết nối bởi sử dụng phương thức DriverManager.getConnection(). Phương thức này có ba mẫu:

Mẫu 1: getConnection(String url)

Mẫu phương thức này chỉ yêu cầu một Database URL. Tuy nhiên, trong trường hợp này, Database URL cũng đã bao cả username và password.

Ví dụ: giả sử bạn đang sử dụng Thin driver của Oracle, với host name là vietjack, cổng là 3306 và tên cơ sở dữ liệu là sinhvien, thì Database URL sẽ là:

jdbc:oracle:thin:username/password@vietjack:3306:sinhvien

Do đó, kết nối trên có thể được tạo như sau:

String URL = "jdbc:oracle:thin:username/password@vietjack:3306:sinhvien";
Connection conn = DriverManager.getConnection(URL);

Mẫu 2: getConnection(String url, Properties info)

Mẫu phương thức này yêu cầu một Database URL và một đối tượng Properties. Một đối tượng Properties giữ một tập hợp các cặp key-value. Mẫu này được sử dụng để truyền các thuộc tính tới driver trong một lời gọi tới phương thức getConnection().

Để tạo kết nối như ví dụ trên, bạn sử dụng:

import java.util.*;

String URL = "jdbc:oracle:thin:@vietjack:3306:sinhvien";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

Connection conn = DriverManager.getConnection(URL, info);

Mẫu 3: getConnection(String url, String user, String password)

Đây là mẫu được sử dụng phổ biến nhất. Bạn sử dụng phương thức này để truyền một Database URL, một username và một password.

Cũng sử dụng ví dụ trên, bây giờ bạn phải gọi phương thức getConnection() này với username và password chính xác để nhận được một đối tượng Connection như sau:

String URL = "jdbc:oracle:thin:@vietjack:3306:sinhvien";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);

Đóng kết nối JDBC

Garbage Collector của Java sẽ đóng kết nối khi nó thực hiện tiến trình xóa các đối tượng đã cũ. Tuy nhiên, sau khi đã thực hiện xong tác vụ với Database, bạn nên đóng tất cả kết nối tới cơ sở dữ liệu. Bước thực hành này là cần thiết và thực sự tốt, vì đôi khi việc quá tin tưởng vào trình dọn rác sẽ gây ra những hậu quả không mong muốn.

Để bảo đảm rằng một kết nối đã được đóng, bạn có thể cung cấp một khối finally trong phần code. Khối finally luôn luôn được thực thi, nếu không thì một exception sẽ xuất hiện.

Để đóng kết nối đã mở ở trên, bạn nên gọi phương thức close() có cú pháp như sau:

public void conn.close() throws SQLException