Java – Kết nối cơ sở dữ liệu MySQL – Phần 2

Rate this post

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()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
0 0 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments