Bài đăng nổi bật

Kết nối với MySQL bằng Java 

1. Cài đặt MySQL 

Bạn đã học xong kỳ 1, tức là bạn đã có kiến thức cơ bản về SQL, nên trong phạm vi bài viết này tôi không nhắc lại các phần kiến thức cơ bản liên quan tới SQL. Tuy nhiên, SQL Server có một nhược điểm đó là nó không độc lập với nền tảng, và việc cài đặt hơi tốn nhiều dung lượng. 

Do vậy, trong phạm vi các hướng dẫn này, tôi sẽ sử dụng MySQL gọn nhẹ được cài đặt sẵn trong XAMPP server. (Ngoài ra, khi cài đặt XAMPP xong thì lúc học PHP các bạn sẽ không phải cặt đặt gì thêm nữa). 

Để thao tác với cơ sở dữ liệu dễ dàng và gọn nhẹ thì tôi khuyên bạn hãy sử dụng dụng DataGrip (cho trọn bộ với bạn IntelliJ IDEA). 

Các bạn hãy cài đặt XAMP và DataGrip theo hướng dẫn trong video này của tôi nhé <3 

2. Cài đặt JDBC Driver 


Để kết nối tới cơ sở dữ liệu, bạn cần cài đặt trình điều khiển Driver phù hợp với loại cơ sở dữ liệu mình chọn. Ví dụ bạn chọn MySQL thì bạn cần search java jdbc driver for mysql.  Nếu các bạn dùng sql thì thay sql vào mysql nhé.  

Các bạn hãy xem video này để biết cách Add Dependencies vào project trong IntelliJ IDEA nhé. 

3. Thiết lập cơ sở dữ liệu


Để viết chương trình kết nối với cơ sở dữ liệu, thì trước tiên chúng ta cần có cơ sở dữ liệu đã ;) 
Vậy trong bước này chúng ta sẽ cùng nhau chuẩn bị một cơ sở dữ liệu nhé. Chúng ta sẽ gọi cơ sở dữ liệu của mình " ebookshop" chứa một bảng gọi là " books", với 5 cột, như sau:
Database: ebookshop
Table: books
+-------+----------------------------+---------------+---------+-------+
| id    | title                      | author        | price   | qty   |
| (INT) | (VARCHAR(50))              | (VARCHAR(50)) | (FLOAT) | (INT) |
+-------+----------------------------+---------------+---------+-------+
| 1001  | Java for dummies           | Dang Kim Thi  | 11.11   |   11  |
| 1002  | More Java for dummies      | CodeLean VN   | 22.22   |   22  |
| 1003  | More Java for more dummies | Mohammad Ali  | 33.33   |   33  |
| 1004  | A Cup of Java              | Kumar         | 44.44   |   44  |
| 1005  | A Teaspoon of Java         | Kevin Jones   | 55.55   |   55  |
+-------+----------------------------+---------------+---------+-------+
Start MySQL ServerKhởi động máy chủ MySQL và xác minh số cổng TCP của máy chủ từ các thông báo trên bàn điều khiển. Tôi sẽ giả sử rằng máy chủ MySQL đang chạy trên số cổng mặc định là 3306.

Chạy các câu lệnh SQL sau để tạo bảng và cơ sở dữ liệu thử nghiệm của chúng tôi.
create database if not exists ebookshop;
 
use ebookshop;
 
drop table if exists books;
create table books (
   id int,
   title varchar(50),
   author varchar(50),
   price float,
   qty int,
   primary key (id));
 
insert into books values (1001, 'Java for dummies', 'Dang Kim Thi', 11.11, 11);
insert into books values (1002, 'More Java for dummies', 'CodeLean VN', 22.22, 22);
insert into books values (1003, 'More Java for more dummies', 'Mohammad Ali', 33.33, 33);
insert into books values (1004, 'A Cup of Java', 'Kumar', 44.44, 44);
insert into books values (1005, 'A Teaspoon of Java', 'Kevin Jones', 55.55, 55);
 
select * from books;

4. Thao tác với cơ sở dữ liệu

Để kết nối và thao tác với cơ sở dữ liệu, chúng ta cần có 4 bước cơ bản như sau: 

  1. Tạo ra một kết nối tới cơ sở dữ liệu, đối tượng đó là Connection .
  2. Tạo ra đối tượng câu lệnh Statement theo Connection, để giữ lệnh SQL.
  3. Viết một truy vấn SQL và thực hiện truy vấn, thông qua Statement và Connection được tạo.
  4. Xử lý kết quả truy vấn.
  5. Đóng Statement và Connection giải phóng tài nguyên.
Chúng ta sẽ minh họa lập trình cơ sở dữ liệu Java bằng các ví dụ sau.

3.1  Example 1: SQL SELECT

Đây là đoạn ví dụ thực hiện lệnh SELECT để truy vấn cơ sở dữ liệu MySQL.
Đặt tên file là  "JdbcSelectTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.sql.*;  // Using 'Connection', 'Statement' and 'ResultSet' classes in java.sql package
 
public class JdbcSelectTest {   // Save as "JdbcSelectTest.java" (JDK 7 and above)
   public static void main(String[] args) {
      try (
         // Step 1: Allocate a database 'Connection' object
                Connection conn = DriverManager.getConnection(
               "jdbc:mysql://localhost:3306/ebookshop?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC",
               "root", "");   // For MySQL only
               // The format is: "jdbc:mysql://hostname:port/databaseName", "username", "password"
 
         // Step 2: Allocate a 'Statement' object in the Connection
         Statement stmt = conn.createStatement();
      ) {
         // Step 3: Execute a SQL SELECT query. The query result is returned in a 'ResultSet' object.
         String strSelect = "select title, price, qty from books";
         System.out.println("The SQL statement is: " + strSelect + "\n"); // Echo For debugging
 
         ResultSet rset = stmt.executeQuery(strSelect);
 
         // Step 4: Process the ResultSet by scrolling the cursor forward via next().
         //  For each row, retrieve the contents of the cells with getXxx(columnName).
         System.out.println("The records selected are:");
         int rowCount = 0;
         while(rset.next()) {   // Move the cursor to the next row, return false if no more row
            String title = rset.getString("title");
            double price = rset.getDouble("price");
            int    qty   = rset.getInt("qty");
            System.out.println(title + ", " + price + ", " + qty);
            ++rowCount;
         }
         System.out.println("Total number of records = " + rowCount);
 
      } catch(SQLException ex) {
         ex.printStackTrace();
      }  // Step 5: Close conn and stmt - Done automatically by try-with-resources (JDK 7)
   }
}
    Phân tích chương trình
    1. Các hoạt động JDBC được thực hiện thông qua các đối tượng Connection", " Statement" và " ResultSet" (được xác định trong gói java.sql). Tuy nhiên, bạn không cần biết chi tiết mà chỉ biết các phương thức công khai được xác định trong API (Giao diện chương trình ứng dụng). Bạn cũng không cần phải phát minh lại các bánh xe bằng cách tự tạo các lớp này (sẽ mất nhiều năm?!). Thành phần phần mềm "tái sử dụng" là một thế mạnh chính của OOP.
    2. Lưu ý rằng có rất ít lập trình liên quan đến việc sử dụng lập trình JDBC. Bạn chỉ phải xác định URL cơ sở dữ liệu , viết truy vấn SQL và xử lý kết quả truy vấn. Các mã còn lại là loại "mẫu chương trình JDBC tiêu chuẩn". Một lần nữa, điều này là do các bánh xe đã được phát minh.
    3. Trong Dòng 7, chúng tôi tạo ra một đối tượng Connection (được gọi conn) thông qua Chương trình Java sử dụng cái gọi là URL cơ sở dữ liệu để kết nối với máy chủ: DriverManager.getConnection(database-urldb-userpassword)
For MySQL:
// Syntax
  1. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:{port}/{db-name}", "{db-user}", "{password}");
  2. // Example
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ebookshop", "myuser", "xxxx");
Đây database-url là ở dạng " jdbc:mysql://{host}:{port}/{database-name}", với giao thức jdbc và giao thức con mysqlViệc port chỉ định số cổng TCP của máy chủ MySQL; db-user/passwordlà một người dùng MySQL được ủy quyền. Trong ví dụ của chúng tôi, "localhost"(với địa chỉ IP đặc biệt của 127.0.0.1) là tên máy chủ cho vòng lặp cục bộ; "3306" là số cổng TCP của máy chủ và ebookshoplà tên cơ sở dữ liệu.

  1. Trong Dòng 13, chúng tôi phân bổ một Statementđối tượng (được gọi stmt) trong Connectionthông qua conn.createStatement().
  2. Để thực thi lệnh SQL SELECT, chúng ta gọi phương thức stmt.executeQuery("SELECT ...")Nó trả về kết quả truy vấn trong một ResultSetđối tượng (được gọi rset).
  3. Các ResultSetmô hình bảng được trả về, có thể được truy cập thông qua một con trỏ hàng . Con trỏ ban đầu định vị trước hàng đầu tiên trong ResultSetrset.next()di chuyển con trỏ đến hàng đầu tiên. Sau đó bạn có thể sử dụng để lấy giá trị của cột cho hàng đó, nơi tương ứng với các loại cột, chẳng hạn như và Trả về ở hàng cuối cùng, kết thúc vòng lặp while.rset.getXxx(columnName)XxxintfloatdoubleStringrset.next()false
  4. Bạn có thể sử dụng để lấy tất cả các loại ( , vv).rset.getString(columnName)intdouble
  5. Để có tính di động tối đa, ResultSetcác cột trong mỗi hàng phải được đọc theo thứ tự từ trái sang phải và mỗi cột chỉ được đọc một lần thông qua các getXxx()phương thức. Phát hành getXxx()cho một ô nhiều lần có thể gây ra lỗi lạ.
  6. Trong ví dụ này, chúng tôi sử dụng tính năng mới của JDK 7 được gọi là tài nguyên thử, tự động đóng tất cả các tài nguyên đã mở trong mệnh đề thử, trong trường hợp của chúng tôi, các đối tượng Connectionvà Statementđối tượng.

Exercises 1:
Các bạn làm bài tương tự để thực hiện hiển thị kết quả của những câu lệnh SELECT sau. 
  1. SELECT * FROM books
  2. SELECT title, price FROM books WHERE author = 'CodeLean VN' 
  3. SELECT title, author, price, qty FROM books WHERE author = 'CodeLean VN' OR price >= 30 ORDER BY price DESC, id ASC
Exercises 2: 
Các bạn sử dụng cơ sở dữ liệu Northwind
để thực hiện hiển thị các thông tin sau:
1. Hiển thị danh sách khách hàng
2. Tìm khách hàng theo tên
3. Hiển thị danh sách sản phẩm
4. Tìm sản phẩm theo giá bán trong khoảng do người dùng nhập vào
5. Hiển thị thông tin chi tiết của một đơn hàng 

1 Nhận xét

Đăng nhận xét

Mới hơn Cũ hơn