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

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ụ

 

pptx 37 trang phuongnguyen 6640
Bạn đang xem 20 trang mẫu của tài liệu "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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: 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à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
 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 lưu ý: 
Mỗi tầng chịu trách nhiệ m rie ̂ ng . 
Dữ liệu đầu vào và đầu ra của mỗi tầng nên rõ ràng và dễ sử dụng. 
Khi một tầng bị thay đổi thì khả năng ảnh hưởng của nó đến các tầng khác thấp nhất nhất có thể có. 
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ử dụng mã 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 
Tầng truy cập dữ liệu 
Cơ sở dữ liệu 
Đối tượng trao đổi dữ liệu: POJO 
Đối tượng trao đổi dữ liệu (POJO) đơn giản 
POJO : Plain Old Java Object 
Mỗi lớp POJO đại diện cho bảng trong cơ sở dữ liệu 
Mỗi lớp POJO gồm những thành phần sau : 
Các thuộc tính tương ứng với các cột trong bảng – Tối thiểu một phương thức khởi tạo mặc định 
Nên viết thêm phương thức khởi tạo đầy đủ tham số 
Các phương 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) đơn giản 
XXX Table 
YYY Table 
ZZZ Table 
Database 
XXX POJO 
YYY POJO 
ZZZ POJO 
*.java 
Đối tượng trao đổi dữ liệu (POJO) đơn giản 
nhanvien 
phongban 
NhanVien 
PhongBan 
POJO: PhongBan 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
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; 
} 
} 
POJO: NhanVien 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
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 phương thức trong DAO có các tham số đầu vào và các kết quả trả ra là: 
Đối tượng POJO, mảng POJO (ArrayList) 
Kiểu dữ liệu đơn giản như: boolean , int , String , float , ... 
Tầng dữ liệu (DAO) 
XXX DAO 
YYY DAO 
ZZZ DAO 
JDBC 
XXX Table 
YYY Table 
ZZZ Table 
*.java 
DB 
POJOs 
Tầng dữ liệu (DAO) 
NhanVien DAO 
PhongBan DAO 
JDBC 
NhanVien 
PhongBan 
*.java 
DB 
POJOs 
NhanVienDAO.java 
PhongBanDAO.java 
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 procedur e 
MySQLDataHelper – Overview 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
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) { 
 } 
} 
MySQLDataHelper – Details ( 1 ) 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
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 layDanhSachPhongBan () 
public static ArrayList 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 layDanhSachPhongBan () { 
 ArrayList ds = new ArrayList(); 
 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 timKiemPhongBanTheoTen ( 
 String tenPhongBan) { 
 ArrayList ds = new ArrayList(); 
 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; 
 } 
PhongBanDAO.java (6) 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
 public static PhongBan layPhongBan ( int maPhong ){ 
 PhongBan pb = null; 
 try { 
 String sql = "SELECT * FROM phongban WHERE MAPHG =" + maPhong ; 
 MySQLDataAccessHelper helper = new MySQLDataAccessHelper (); 
 helper.open(); 
 ResultSet rs = helper.executeQuery(sql); 
 if (rs.next()) { 
 pb = new PhongBan (); 
 pb.setMAPHG(rs.getInt( "MAPHG" )); 
 pb.setTENPHG(rs.getString( "TENPHG" )); 
 } 
 helper.close(); 
 } catch (Exception ex) { 
 System.out.println(ex.getMessage()); 
 } 
 return pb; 
 } 
} 
NhanVienDAO.java 
Lấy danh sách nhân viên 
Lấy thông tin chi tiết của nhân viên dựa trên mã nhân viên 
Kiểm tra xem nhân viên đã tồn tại chưa 
Thêm nhân viên 
Xóa nhân viên 
Cập nhật nhân viên 
Tầng giao diện (GUI) 
Có nhiều loại giao diện: 
Giao diện WEB 
Giao diện Window 
Giao diện Mobile 
Tầng giao diện (GUI) 
XXX DAO 
YYY DAO 
ZZZ DAO 
JDBC 
XXX Table 
YYY Table 
ZZZ Table 
*.java 
DB 
POJOs 
Màn hình giao diện 
Tầng giao diện (GUI) 
NhanVien DAO 
PhongBan DAO 
JDBC 
NhanVien 
PhongBan 
*.java 
DB 
POJOs 
NhanVienDAO.java 
PhongBanDAO.java 
VD 1: Chức năng Xem danh sách phòng ban 
PhongBan DAO 
PhongBan 
DB 
PB1_GetListPhongBan 
GUI 
DAO 
layDanhSachPhongBan (); 
GUI: PB1_GetListPhongBan 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
package demo2layer; 
import dao.PhongBanDAO ; import java.util.ArrayList; 
import javax.swing.JInternalFrame; 
import javax.swing.table.DefaultTableModel; import pojo.PhongBan ; 
public class PB1_GetListPhongBan extends JInternalFrame { 
 public PB1_GetListPhongBan () { 
 initComponents(); 
 ArrayList dsPhongBan = PhongBanDAO. layDanhSachPhongBan (); 
 String[] columns = new String [] { "Mã Phòng" , "Tên Phòng" }; 
 DefaultTableModel model = new DefaultTableModel( null , columns); 
 for (PhongBan p: dsPhongBan) { 
 Object [] items = new Object [] { 
 p.getMAPHG(), 
 p.getTENPHG() 
 }; 
 model. addRow (items); 
 } 
 jTable1 .setModel(model); 
 } 
} 
VD 2: Chức năng Thêm phòng ban 
PhongBan DAO 
PhongBan 
DB 
PB2_InsertPhongBan 
GUI 
DAO 
themPhongBan (); 
GUI: PB2_InsertPhongBan 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
package demo2layer; 
import dao.PhongBanDAO; import javax.swing.JOptionPane; 
import pojo.PhongBan; 
public class PB2_InsertPhongBan extends javax.swing.JInternalFrame { 
 public PB2_InsertPhongBan() { 
 initComponents(); 
 } 
 private void initComponents() {  } 
 private void jbtnThemPhongActionPerformed(java.awt.event.ActionEvent evt) { 
 String tenphong = jtxtTENPHG. getText (); 
 PhongBan p = new PhongBan (); 
 p . setTENPHG (tenphong); 
 PhongBanDAO.themPhongBan( p ); 
 JOptionPane. showMessageDialog (this, "Thêm thành công", "Thông báo", JOptionPane.INFORMATION_MESSAGE); 
 } 
 private javax.swing.JButton jbtnThemPhong; 
 private javax.swing.JTextField jtxtTENPHG; 
} 
VD 3: Chức năng Cập nhật phòng ban 
PhongBan DAO 
PhongBan 
DB 
PB3_UpdatePhongBan 
GUI 
DAO 
capNhatPhongBan (); 
layPhongBan (); 
GUI: PB3_UpdatePhongBan 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
 private void btnDocActionPerformed(java.awt.event.ActionEvent evt) { 
 int maphg = Integer.parseInt(jtxtMaPhong.getText()); 
 PhongBan p = PhongBanDAO.layPhongBan(maphg) ; 
 if (p == null ) { 
 JOptionPane.showMessageDialog(this, "Not found !!!", "Error", JOptionPane.ERROR_MESSAGE); 
 } 
 else { 
 jtxtTenPhong.setText(p.getTENPHG()); 
 } 
 } 
GUI: PB3_UpdatePhongBan 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
 private void btnLuuActionPerformed(java.awt.event.ActionEvent evt) { 
 int maphong = Integer.parseInt(jtxtMaPhong.getText()); 
 String tenphong = jtxtTenPhong.getText(); 
 PhongBan p = new PhongBan ( maphong , tenphong ); 
 PhongBanDAO.capNhatPhongBan(p ); 
 JOptionPane.showMessageDialog( this , "Cập nhật thành công ", "Thông báo", JOptionPane.INFORMATION_MESSAGE); 
} 

File đính kèm:

  • pptxbai_giang_lap_trinh_java_chuong_5_lap_trinh_theo_mo_hinh_2_l.pptx