Giới thiệu
Trong nhóm bài này, chúng ta cùng nhau tìm hiểu việc thiết kế một kiến trúc để lập trình phần mềm theo mô hình 3 lớp.
Những nội dung chính sẽ được trình bày trong nhóm bài:
- Thiết lập một cơ sở dữ liệu cơ bản trong
PostgreSQLđể áp dụng trong toàn bộ nhóm bài. Chúng ta có thể tham khảo để tự thực hiện đối với những hệ quản trị cơ sở dữ liệu khác như:MySQL/MariaDB;SQLServer;Oracle; …
- Thiết kế kiến trúc lập trình phần mềm theo mô hình 3 lớp. Chúng ta cũng sẽ áp dụng một chút kiến thức về lập trình hướng đối tượng ở đây.
- Kỹ thuật kết nối và truy vấn cơ sở dữ liệu theo phương pháp
Prepared Statement. Đây là phương pháp được ưu tiên khuyến khích hơn phương pháp thông thường.
- Những kỹ thuật lập trình cụ thể sẽ được trình bày lần lượt với các ngôn ngữ: Java / C# / Python / PHP.
Nội dung chính của bài này là trình bày phần thứ hai và tập trung vào Tầng 3 trong nội dung về kỹ thuật lập trình với ngôn ngữ Java:
- Phần 1. Xây dựng kiến trúc tổng quan của mô hình 3 lớp.
- Phần 2. Kỹ thuật lập trình cụ thể cho từng tầng trong kiến trúc mô hình 3 lớp.
Class BaseDAO – Kiến trúc tổng quan
Bước 1.
Chúng ta thiết kế lớp cơ sở BaseDAO thành abstract class như sau:

Bước 2.
Chúng ta định nghĩa các thuộc tính trong class BaseDAO:

Bước 3.
Chúng ta định nghĩa phương thức khởi tạo không có tham số của class BaseDAO:

Bước 4.
Chúng ta định nghĩa các phương thức chính trong class BaseDAO:

Class BaseDAO – Phương thức getConnection()
Chúng ta đặc tả phương thức getConnection() đối với tác vụ kết nối đến PostgreSQL:

Class BaseDAO – Phương thức selectDataFromOneTable()
Bước 1.
Chúng ta đặc tả phương thức selectDataFromOneTable() đối với tác vụ truy xuất dữ liệu từ một bảng trong PostgreSQL.
Chúng ta thực hiện kỹ thuật bắt lỗi kết nối và truy vấn cơ sở dữ liệu:

Bước 2.
Mã nguồn SQL tổng quan để thực hiện truy vấn dữ liệu:
SELECT column_i, …, column_j FROM table [WHERE column_k = value_k AND … AND column_l = value_l]
Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 3.
Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Kỹ thuật lập trình cần chú ý ở đây:
- Giá trị của từng trường điều kiện được thể hiện bằng dấu “?”.
- Chúng ta sẽ thay thế từng dấu “?” bằng giá trị tương ứng trong
dataSetở các bước sau.
- Đây là bước đầu tiên của kỹ thuật
Prepared Statement. Kỹ thuật này giúp truy xuất dữ liệu thuận tiện hơn, độc lập cơ sở dữ liệu và phần nào chống được kỹ thuật tấn côngSQL Injection.
Bước 4.
Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 5.
Chúng ta định nghĩa một thực thể của class PreparedStatement:

Đây là bước thứ hai của kỹ thuật Prepared Statement giúp chuẩn bị thay thế từng dấu “?” trong chuỗi SQL bởi giá trị tương ứng.
Bước 6.
Chúng ta gọi phương thức appendData() để thực hiện bước thứ ba của kỹ thuật Prepared Statement là thay thế từng dấu “?” trong chuỗi SQL bởi giá trị tương ứng:

Kỹ thuật lập trình cần chú ý ở đây:
- Chúng ta định nghĩa phương thức
appendData()là abstract trongclass BaseDAO.
- Chúng ta đặc tả cụ thể các kỹ thuật lập trình của phương thức
appendData()trong các lớp dẫn xuất làCategoryDAOvàProductDAO.
Bước 7.
Chúng ta thực hiện truy vấn dữ liệu và trả về kết quả là một thực thể của class ResultSet.
Chúng ta tiếp tục gọi phương thức mappingData() để thực hiện việc chuyển đổi dữ liệu trong thực thể này về dạng mong muốn và thêm vào results.

Kỹ thuật lập trình cần chú ý ở đây:
- Chúng ta định nghĩa phương thức
mappingData()làabstracttrongclass BaseDAO.
- Chúng ta đặc tả cụ thể các kỹ thuật lập trình của phương thức
mappingData()trong các lớp dẫn xuất làCategoryDAOvàProductDAO.
Bước 8.
Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức insertData()
Bước 1.
Chúng ta đặc tả phương thức insertData() đối với tác vụ thêm dữ liệu vào một bảng trong PostgreSQL.
Chúng ta thực hiện kỹ thuật bắt lỗi kết nối và truy vấn cơ sở dữ liệu:

Bước 2.
Mã nguồn SQL tổng quan để thực hiện thêm dữ liệu:
INSERT INTO table (column_i, …, column_j) VALUE (value_i, …, value_j)
Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 3.
Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Bước 4.
Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 5.
Chúng ta định nghĩa một thực thể của class PreparedStatement:

Bước 6.
Chúng ta gọi phương thức appendData() để thực hiện bước thứ ba của kỹ thuật Prepared Statement là thay thế từng dấu “?” trong chuỗi SQL bởi giá trị tương ứng:

Bước 7.
Chúng ta thực hiện thêm dữ liệu:

Bước 8.
Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức updateData()
Bước 1.
Chúng ta đặc tả phương thức updateData() đối với tác vụ cập nhật dữ liệu trong một bảng trong PostgreSQL.
Chúng ta thực hiện kỹ thuật bắt lỗi kết nối và truy vấn cơ sở dữ liệu:

Bước 2.
Mã nguồn SQL tổng quan để thực hiện cập nhật dữ liệu:
UPDATE table SET (column_i = value_i, …, column_j = value_j) [WHERE column_k = value_k AND … AND column_l = value_l]
Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 3.
Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Bước 4.
Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 5.
Chúng ta định nghĩa một thực thể của class PreparedStatement:

Bước 6.
Chúng ta gọi phương thức appendData() để thực hiện bước thứ ba của kỹ thuật Prepared Statement là thay thế từng dấu “?” trong chuỗi SQL bởi giá trị tương ứng:

Bước 7.
Chúng ta thực hiện cập nhật dữ liệu:

Bước 8.
Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức deleteData()
Bước 1.
Chúng ta đặc tả phương thức deleteData() đối với tác vụ xóa dữ liệu trong một bảng trong PostgreSQL.
Chúng ta thực hiện kỹ thuật bắt lỗi kết nối và truy vấn cơ sở dữ liệu:

Bước 2.
Mã nguồn SQL tổng quan để thực hiện xóa dữ liệu:
DELETE FROM table WHERE column_k = value_k AND … AND column_l = value_l
Chúng ta đặc tả chuỗi SQL như sau:

Bước 3.
Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 4.
Chúng ta định nghĩa một thực thể của class PreparedStatement:

Bước 5.
Chúng ta gọi phương thức appendData() để thực hiện bước thứ ba của kỹ thuật Prepared Statement là thay thế từng dấu “?” trong chuỗi SQL bởi giá trị tương ứng:

Bước 6.
Chúng ta thực hiện xóa dữ liệu:

Bước 7.
Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class CategoryDAO
Bước 1.
Chúng ta thiết kế lớp dẫn xuất CategoryDAO như sau:

Bước 2.
Chúng ta đặc tả kỹ thuật lập trình cho phương thức appendData() như sau:

Kỹ thuật lập trình cần chú ý:
- Mỗi trường trong bảng
categorycó định dạng khác nhau. Tương ứng là từng phần tử trong danh sáchdatacũng có định dạng khác nhau.
- Theo quy định về kiểu dữ liệu
Listtrong Java thì mọi phần tử đều phải có cùng một định dạng.
- Như vậy chúng ta định nghĩa kiểu dữ liệu cho từng phần tử trong
datalàObject:List<Object> data. Đây là mộtclassnguyên thủy và là cha của mọiclassđược định nghĩa.
Bước 3.
Chúng ta đặc tả kỹ thuật lập trình cho phương thức mappingData() như sau:

Class ProductDAO
Bước 1.
Chúng ta thiết kế lớp dẫn xuất ProductDAO như sau:

Bước 2.
Chúng ta đặc tả kỹ thuật lập trình cho phương thức appendData() như sau:

Bước 3.
Chúng ta đặc tả kỹ thuật lập trình cho phương thức mappingData() như sau:

Kết luận
Trong bài này, chúng ta cùng nhau tìm hiểu việc thực hiện kỹ thuật lập trình cho phần thứ hai và tập trung vào Tầng 3.
Trong bài tiếp theo, chúng ta cùng tìm hiểu việc thực hiện kỹ thuật lập trình cho Tầng 2.





































































































































