Giới thiệu
Hiện nay hầu hết các ứng dụng Java hay các framework của nó đều dần chuyển sang các ORM (Object Relational Mapping) để làm việc với database, có thể kể đến là hibernate được sử dụng rộng rãi. Thế nên mọi người có xu hướng dần quên đi JDBC, thế nhưng các bạn có biết rằng bên dưới hibernate đang sử dụng JDBC để để kết nối đến database và thực thi các lệnh SQL được nó tạo ra.
JDBC là gì?
JDBC là viết tắt của Java Database Connectivity, là một Java API chuẩn để kết nối giữa ngôn ngữ lập trình Java và các cơ sở dữ liệu đa dạng. Sử dụng JDBC, bạn có thể thực hiện nhiều tác vụ đa dạng khi làm việc với cơ sở dữ liệu như tạo, xóa cơ sở dữ liệu, tạo và thực thi các lệnh SQL hoặc tạo, xóa các bản ghi, …
API là gì
API (Application programming interface – Giao diện lập trình ứng dụng) là một tài liệu có chứa mô tả về tất cả các tính năng của một sản phẩm hoặc phần mềm. Nó đại diện cho các lớp và các giao diện (interface) mà các chương trình phần mềm có thể làm theo để giao tiếp với nhau. Một API có thể được tạo cho các ứng dụng, thư viện, hệ điều hành, …
Kiến trúc JDBC
JDBC API: Cho phép chương trình Java thực thi các câu lệnh SQL và truy xuất kết quả. Một số class và interface quan trọng được định nghĩa trong JDBC API như sau:
- DriverManager: Đóng vai trò quan trọng trong kiến trúc JDBC. Nó sử dụng một số quy trình điều khiển dành riêng cho cơ sở dữ liệu để kết nối hiệu quả các ứng dụng doanh nghiệp với database
- JDBC Driver: Để giao tiếp với nguồn dữ liệu thông qua JDBC, bạn cần JDBC Driver để giao tiếp với nguồn dữ liệu tương ứng. Có 4 loại JDBC drivers:
- JDBC – ODBC Bridge Driver
- Native Drive
- Network Protocol Driver
- Thin driver
Các thành phần chính trong JDBC
- DriverManager: Là một class dùng để quản lý danh sách các Driver
- Driver: Là một interface, chịu trách nhiệm xử lý các hoạt động giao tiếp giữa ứng dụng và database
- Connection: Là một interface, cung cấp các phương thức cho việc thao tác với database
- Statement: Là một interface, để thực thi các câu lệnh SQL xuống database
- ResultSet: Là một bảng dữ liệu mà biểu diễn tập kết quả từ cơ sở dữ liệu trả về bởi các lệnh SQL
- SQLException: Xử lý ngoại lệ xảy ra trong database
Các bước kết nối database với Java
- Tải driver vào Java library (Load driver)
- Tạo kết nối (Create Connection)
- Tạo câu lệnh truy vấn SQL (Statement)
- Thực thi câu lệnh truy vấn SQL (Excute query)
- Đóng kết nối (Close Connection)
Project minh họa
Chuẩn bị database
Trong ví dụ này mình sẽ sử dụng MySQL.
Mình có một bảng users với cấu trúc sau:
Cài đặt thư viện
Ở đây mình sẽ sử dụng Maven để quản lý chương trình Java, Nếu bạn sử dụng database khác thì hãy sử dụng các dependency khác. Add 2 dependency vào file pom.xml
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc10 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc10</artifactId>
<version>19.13.0.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
Tạo kết nối tới database
Để có thể kết nối tới database chúng ta cần chuẩn bị các thông tin như: hostname, username, password, database
public class ConnectJDBC {
private String hostName = "localhost:8082";
private String dbName = "my_database";
private String username = "root";
private String password = "123";
private String connectionURL = "jdbc:mysql://"+hostName+"/"+dbName;
public Connection connect(){
//Tạo đối tượng Connection
Connection conn = null;
try {
conn = DriverManager.getConnection(connectionURL, username, password);
System.out.println("Kết nối thành công");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
Sử dụng JDBC API để truy vấn dữ liệu
Lấy ra toàn bộ thông tin users
public class Main {
public static void main(String[] args) {
ConnectJDBC connectJDBC = new ConnectJDBC();
Connection conn = connectJDBC.connect();
String query = "SELECT * FROM users";
Statement stm = null;
try {
//Tạo đối tượng Statement
stm = conn.createStatement();
//Thực thi truy vấn và trả về đối tượng ResultSet
ResultSet rs = stm.executeQuery(query);
//Duyệt kết quả trả về
while (rs.next()){ //Di chuyển con trỏ xuống bản ghi kế tiếp
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " - " + username + " - " + password + " - " + email);
}
//Đóng kết nối
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả:
Kết nối thành công
1 - ngoc - 12345 - [email protected]
2 - hoang - 12345 - [email protected]
3 - linh - 12345 - [email protected]
4 - quan - 12345 - [email protected]
Chỉ định tham số đầu vào với PreparedStatement
Tham số được đại diện bởi dấu ?, bạn phải cung cấp giá trị cho tất cả các tham số trước khi thực hiện câu lệnh SQL. Mỗi tham số sẽ được đánh dấu bằng số thứ tự, tham số đầu tiên có vị trí là 1, kế tiếp là 2,…
public class Main {
public static void main(String[] args) {
ConnectJDBC connectJDBC = new ConnectJDBC();
Connection conn = connectJDBC.connect();
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstm = null;
try {
//Tạo đối tượng Statement
pstm = conn.prepareStatement(query);
//gán các giá trị vào tham số
pstm.setString(1, "ngoc");
//Thực thi truy vấn và trả về đối tượng ResultSet
ResultSet rs = pstm.executeQuery();
//Duyệt kết quả trả về
while (rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " - " + username + " - " + password + " - " + email);
}
//Đóng kết nối
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả:
Kết nối thành công
1 - ngoc - 12345 - [email protected]
Thêm dữ liệu mới
public class Main {
public static void main(String[] args) {
ConnectJDBC connectJDBC = new ConnectJDBC();
Connection conn = connectJDBC.connect();
String query = "INSERT INTO users(id, username, password, email) " +
"VALUES (null, ?,?,?)";
PreparedStatement pstm = null;
try {
pstm = conn.prepareStatement(query);
pstm.setString(1, "hung");
pstm.setString(2, "123456789");
pstm.setString(3, "[email protected]");
//Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate(), nó sẽ trả về số hàng bị tác động
int row = pstm.executeUpdate();
if(row != 0){
System.out.println("Thêm thành công " + row);
}
//Đóng kết nối
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả:
Cập nhật mật khẩu
public class Main {
public static void main(String[] args) {
ConnectJDBC connectJDBC = new ConnectJDBC();
Connection conn = connectJDBC.connect();
String query = "UPDATE users SET password = ? WHERE id = ?";
PreparedStatement pstm = null;
try {
pstm = conn.prepareStatement(query);
pstm.setString(1, "ngoc123");
pstm.setInt(2, 1);
//Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate, nó sẽ trả về số hàng bị tác động
int row = pstm.executeUpdate();
if(row != 0){
System.out.println("Cập nhật thành công " + row);
}
//Đóng kết nối
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả:
Xóa một record
public class Main {
public static void main(String[] args) {
ConnectJDBC connectJDBC = new ConnectJDBC();
Connection conn = connectJDBC.connect();
String query = "DELETE FROM users WHERE id = ?";
PreparedStatement pstm = null;
try {
pstm = conn.prepareStatement(query);
pstm.setInt(1, 1);
//Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate, nó sẽ trả về số hàng bị tác động
int row = pstm.executeUpdate();
if(row != 0){
System.out.println("Xóa thành công " + row);
}
//Đóng kết nối
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả: