LOGO
Phát triển UD CSDL 2
Chương 5:
Lập trình theo mô
hình 2 lớp với JAVA
Nội dung
•
•
•
•
•
Hướng tiếp cận phân tầng trong phần mềm
Vai trò của hướng tiếp cận phân tầng
Một số hướng tiếp cận phân từng thông dụng
Mô hình 2 tầng đơn giản
Một số ví dụ
Hướng tiếp cận phân tầng
•
•
Chia phần mềm thành các tầng (layer)
Khi thiết kế cần luu y
̛ ́:
–
–
–
Mỗi tầng chiu tra
̣
́ch nhiệm riêng.
Dữ liệu đầu vào và đầu ra cua mô
̉
̃i tầng nên rõ ràng và dễ
sử dung.
̣
Khi một tầng bi thay đôi thi
̣
̉
̀ kha na
̉ ̆ng anh hu
̉
̛ơng cua no
̉
̉
́ đến các
tầng khác thấp nhất nhất có thê co
̉ ́.
Vai trò của hướng tiếp cận phân tầng
•
•
•
•
Sẵn sàng cho việc mở rộng hệ thống
Tái sử dung ma
̣
̃ nguồn
Dễ bảo trì hệ thống
Dễ dàng phân chia công việc trong nhóm
Một số mô hình phân tầng
•
•
•
2 Layer / 2 Tier
3 Layer / 3 Tier
N Layer / N Tier
Mô hình 2 tầng đơn giản
Tầng giao diện
Đối tượng
trao đổi dữ
liệu: POJO
Tầng truy cập dữ
liệu
Cơ sở dữ liệu
•
•
•
Đối tượng trao đổi dữ liệu (POJO)
đơn giản
POJO: Plain Old Java Object
Mỗi lớp POJO đai di
̣ ện cho bang trong co s
̉
̛ ở dữ liệu
Mỗi lớp POJO gồm những thành phần sau:
–
–
–
Các thuộc tính tuong
̛ ̛ ứng với các cột trong bang – Tô
̉
́i thiêu
̉
một phuong th
̛ ̛
ức khởi tao m
̣
ặc đinh
̣
Nên viết thêm phuong th
̛ ̛
ức khởi tao đâ
̣
̀y đu tham sô
̉
́
Các phuong th
̛ ̛
ức cung cấp và cập nhật thông tin cho từng
thuộc tính (get/set)
Đối tượng trao đổi dữ liệu (POJO)
*.java
đơn Database
giản
XXXTable
XXXPOJO
YYYTable
YYYPOJO
ZZZTable
ZZZPOJO
Đối tượng trao đổi dữ liệu (POJO)
đơn giản
nhanvien
NhanVien
phongban
PhongBan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POJO: PhongBan
package pojo;
import java.io.Serializable;
public class PhongBan implements Serializable {
private int MAPHG;
private String TENPHG;
//Các phương thức khởi tạo
public PhongBan() {
}
public PhongBan(int maPhongBan, String tenPhongBan) {
this.MAPHG = maPhongBan;
this.TENPHG = tenPhongBan;
}
// Các phương thức get/set
public String getTenPhong() {
return this.TENPHG;
}
public void setTenPhong (String tenphong) {
this.TENPHG = tenphong;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
POJO: NhanVien
package pojo;
import java.io.Serializable;
public class NhanVien implements Serializable {
//Các thuộc tính
private int MANV;
private String HOTEN;
private String PHAI;
private Date NGAYSINH;
private String DIACHI;
private float LUONG;
private int PHONG;
private Boolean TRANGTHAI;
//Các phương thức khởi tạo
…
…
// Các phương thức get/set
…
…
Tầng dữ liệu (DAO)
•
•
Mỗi DAO đại diện cho một bảng bên dưới CSDL
Mỗi DAO thường chứa những phương thức như:
–
–
–
•
Thêm, xoá, sửa dữ liệu
Rú t trí ch dữ liệ u
Các phương thức truy xuất dữ liệu hỗ trợ cho nghiệp vụ
Mỗi phuong th
̛ ̛
ức trong DAO có các tham số đầu vào và
các kết qua tra ra la
̉ ̉
̀:
–
–
Đối tượng POJO, mang POJO
̉
(ArrayList<POJO>)
Kiêu d
̉ ữ liệu đon gian nhu:
̛
̉
̛ boolean,int, String, float, ...
Tầng dữ liệu (DAO)
*.java
XXXDAO
YYYDAO
ZZZDAO
POJOs
JDBC
DB
XXXTable
YYYTable
ZZZTable
Tầng dữ liệu (DAO)
*.java
NhanVienDAO.java
NhanVienDAO
PhongBanDAO.java
PhongBanDAO
POJOs
JDBC
DB
NhanVien
PhongBan
Xây dựng lớp hỗ trợ kết nối và truy xuất
CSDL – MySQLDataHelper
•
Mục đích:
–
Tập trung hoá các thao tác mở kết nối cơ sở dữ liệu, thực hiện các
truy vấn (thêm, xoá, sửa, đọc, tìm kiếm, …) do một lớp quản lý
nâng cao khả năng tái sử dụng và bảo trì.
Xây dựng lớp MySQLDataHelper
Một số tên gọi khác: DataService, DataProvider
Một số phương thức cơ bản cần xây dựng:
Mở kết nối
Đóng kết nối
Thực thi câu lệnh SQL
Thực thi stored procedure
…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MySQLDataHelper – Overview
package dao;
import …;
public class MySQLDataAccessHelper {
private Connection connection;
public void open() {
…
}
public void close() {
…
}
public ResultSet executeQuery(String sql) {
…
}
public int executeUpdate(String sql) {
…
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MySQLDataHelper – Details (1)
package dao;
import java.sql.Connection; import java.sql.Driver;
import java.sql.DriverManager; import java.sql.ResultSet;
import java.sql.Statement; import java.util.Properties;
public class MySQLDataAccessHelper {
private Connection connection;
public void open() {
try {
Driver d = new org.gjt.mm.mysql.Driver();
DriverManager.registerDriver(d);
String url = "jdbc:mysql://localhost:3306/nhanviendb";
Properties info = new Properties();
info.setProperty("characterEncoding", "utf8");
info.setProperty("user", "root");
info.setProperty("password", "");
this.connection = DriverManager.getConnection(url, info);
} catch (Exception ex) {
System.out.println(ex.getMessage());
MySQLDataHelper – Details (2)
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void close() {
try {
this.connection.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public ResultSet executeQuery (String sql) {
ResultSet rs = null;
try {
Statement sm = this.connection.createStatement();
rs = sm.executeQuery(sql);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return rs;
MySQLDataHelper – Details (3)
39
40
41
42
43
44
45
46
47
48
49
50
51
public int executeUpdate(String sql) {
int n = 1;
try {
Statement sm = this.connection.createStatement();
n = sm.executeUpdate(sql);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return n;
}
}
PhongBanDAO.java
•
Xây dựng lớp truy cập dữ liệu PhongBanDAO với các
phương thức:
–
–
–
–
–
–
public static ArrayList<PhongBan> layDanhSachPhongBan()
public static ArrayList<PhongBan> timKiemPhongBanTheoTen
(String tenPhongBan)
public static boolean themPhongBan(PhongBan pb)
public static boolean xoaPhongBan(int maPhongBan)
public static boolean capNhatPhongBan(PhongBan pb)
public static PhongBan layPhongBan (int maPhong)
Lưu ý: Tuỳ theo nghiệp vụ mà lớp truy cập dữ liệu có những phương
thức khác. VD:
–
public static boolean kiemTraTonTai(int maPhongBan)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package dao;
import java.sql.ResultSet;
import java.util.ArrayList;
import pojo.PhongBan;
public class PhongBanDAO {
public static ArrayList<PhongBan> layDanhSachPhongBan() {
ArrayList<PhongBan> ds = new ArrayList<PhongBan>();
try {
String sql = "SELECT * FROM PHONGBAN";
MySQLDataAccessHelper helper = new MySQLDataAccessHelper();
helper.open();
ResultSet rs = helper.executeQuery(sql);
while (rs.next()) {
PhongBan pb = new PhongBan();
pb.setMAPHG(rs.getInt("MAPHG"));
pb.setTENPHG(rs.getString("TENPHG"));
ds.add(pb);
}
helper.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return ds;
}
PhongBanDAO.java
(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static ArrayList<PhongBan> timKiemPhongBanTheoTen(
String tenPhongBan) {
ArrayList<PhongBan> ds = new ArrayList<PhongBan>();
try {
String sql = "SELECT * FROM phongban WHERE TENPHG LIKE '%"
+ tenPhongBan + "%'";
MySQLDataAccessHelper helper = new MySQLDataAccessHelper();
helper.open();
ResultSet rs = helper.executeQuery(sql);
while (rs.next()) {
PhongBan pb = new PhongBan();
pb.setMAPHG(rs.getInt("MAPHG"));
pb.setTENPHG(rs.getString("TENPHG"));
ds.add(pb);
}
helper.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return ds;
}
PhongBanDAO.java
(2)
PhongBanDAO.java (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static boolean themPhongBan(PhongBan pb) {
boolean kq = false;
String sql = String.format(
"INSERT INTO phongban(TENPHG) VALUES ('%s');",
pb.getTENPHG());
MySQLDataAccessHelper helper = new MySQLDataAccessHelper();
helper.open();
int n = helper.executeUpdate(sql);
if (n == 1) {
kq = true;
}
helper.close();
return kq;
}
PhongBanDAO.java (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static boolean xoaPhongBan(int maPhongBan) {
boolean kq = false;
String sql = String.format("DELETE FROM PHONGBAN WHERE
MAPHG=%d", maPhongBan);
MySQLDataAccessHelper helper = new MySQLDataAccessHelper();
helper.open();
int n = helper.executeUpdate(sql);
if (n == 1) {
kq = true;
}
helper.close();
return kq;
}
PhongBanDAO.java (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static boolean capNhatPhongBan(PhongBan pb) {
boolean kq = false;
String sql = String.format(
"UPDATE PHONGBAN SET TENPHG ='%s' WHERE MAPHG =
%d",
pb.getTENPHG(), pb.getMAPHG());
MySQLDataAccessHelper helper = new MySQLDataAccessHelper();
helper.open();
int n = helper.executeUpdate(sql);
if (n == 1) {
kq = true;
}
helper.close();
return kq;
}