Tải bản đầy đủ (.pdf) (37 trang)

Bài giảng Lập trình Java - Chương 5: Lập trình theo mô hình 2 lớp với Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.91 MB, 37 trang )

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", "utf­8"); 
            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;
    }


×