Trong phần này chúng ta tiếp tục tìm hiểu các thao tác thêm, sửa, xóa với CSDL MySQL.
Trước tiên chúng ta cần có vài dòng dữ liệu mẫu.
CREATE TABLE IF NOT EXISTS Authors(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25)) ENGINE=InnoDB; INSERT INTO Authors(Id, Name) VALUES(1, 'Jack London'); INSERT INTO Authors(Id, Name) VALUES(2, 'Honore de Balzac'); INSERT INTO Authors(Id, Name) VALUES(3, 'Lion Feuchtwanger'); INSERT INTO Authors(Id, Name) VALUES(4, 'Emile Zola'); INSERT INTO Authors(Id, Name) VALUES(5, 'Truman Capote'); INSERT INTO Authors(Id, Name) VALUES(100, 'Taylor Swift'); INSERT INTO Authors(Id, Name) VALUES(1912, 'Titanic');
INSERT – UPDATE – DELETE
Ở đây chúng ta dùng lớp PreparedStatement
lưu trữ các câu truy vấn mẫu, khi nào cần thực thi thì chúng ta chỉ cần truyền tham số vào và chạy thay vì viết câu truy vấn trực tiếp lên CSDL.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class JDBCExample { public static void main(String[] args) { Connection con = null; PreparedStatement pst = null; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = ""; try { String author = "J.K. Rowling"; con = DriverManager.getConnection(url, user, password); // INSERT pst = con.prepareStatement("INSERT INTO Authors(Name) VALUES(?)"); pst.setString(1, author); pst.executeUpdate(); // UPDATE pst = con.prepareStatement("UPDATE Authors SET Name=? WHERE Id=?"); pst.setString(1, "Christopher Paolini"); pst.setInt(2, 100); pst.executeUpdate(); // DELETE pst = con.prepareStatement("DELETE FROM Authors WHERE Id=?"); pst.setInt(1, 1912); pst.executeUpdate(); } catch (SQLException ex) { ex.printStackTrace(); } finally { try { if (pst != null) { pst.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } } }
Chúng ta thêm một dòng dữ liệu mới vào bảng Authors
.
pst = con.prepareStatement("INSERT INTO Authors(Name) VALUES(?)");
Chúng ta tạo đối tượng PreparedStatement
. Dùng lớp này sẽ an toàn hơn là thực thi trực tiếp các câu truy vấn lên CSDL bằng lớp Statement
vì có thể chống được kiểu tấn công SQL Injection. Ở đây chúng ta có câu truy vấn mẫu và các tham số là ký tự ?
, chúng ta phải truyền giá trị vào các tham số đó.
pst.setString(1, author);
Để truyền giá trị thì chúng ta dùng các phương thức thiết lập dữ liệu như setString()
, tham số thứ nhất của phương thức này là kí tự ? thứ mấy và tham số thứ 2 là giá trị truyền vào. Ở đây chúng ta truyền vào dấu ? thứ 1 và sẽ truyền vào đó biến author,
các phương thức như setInt()
cũng tương tự.
pst.executeUpdate();
Sau khi đã có đầy đủ tham số cho câu truy vấn thì chúng ta thực thi câu truy vấn bằng phương thức executeUpdate()
. Phương thức này dùng chung cho tất cả các loại truy vấn mà không trả về bảng dữ liệu nào như INSERT
, UPDATE
, DELETE
, giá trị trả về của phương thức này là True
hoặc False
.
SELECT
Tiếp theo chúng ta sẽ lấy dữ liệu từ CSDL.
import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class QueryExample { public static void main(String[] args) { Connection con = null; PreparedStatement pst = null; ResultSet rs = null; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = ""; try { con = DriverManager.getConnection(url, user, password); pst = con.prepareStatement("SELECT * FROM Authors"); rs = pst.executeQuery(); while (rs.next()) { System.out.print(rs.getInt(1)); System.out.print(": "); System.out.println(rs.getString(2)); } } catch (SQLException ex) { ex.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (pst != null) { pst.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } } }
Chúng ta sẽ truy xuất dữ liệu từ bảng Authors
.
pst = con.prepareStatement("SELECT * FROM Authors"); rs = pst.executeQuery();
Chúng ta thực thi câu lệnh SELECT
bằng phương thức executeQuery()
, phương thức này trả về một đối tượng ResultSet
.
while (rs.next()) { System.out.print(rs.getInt(1)); System.out.print(": "); System.out.println(rs.getString(2)); }
Trong đối tượng ResultSet
có một con trỏ chỉ đến hàng hiện tại, mặc định con trỏ này chỉ đến hàng số 0, hàng đầu tiên chứa dữ liệu là hàng số 1, phương thức next()
có tác dụng di chuyển con trỏ đó lên một hàng. Phương thức getInt()
và getString()
sẽ lấy giá trị ở cột và chúng ta chỉ định với hàng hiện tại của con trỏ.
1: Jack London 2: Honore de Balzac 3: Lion Feuchtwanger 4: Emile Zola 5: Truman Capote 100: Christopher Paolini 1913: J.K. Rowling