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
37 trang |
Chia sẻ: thanhle95 | Lượt xem: 496 | Lượt tải: 0
Bạn đang xem trước 20 trang 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 5:Lập trình theo mô hình 2 lớp với JAVANội dungHướng tiếp cận phân tầng trong phần mềmVai 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 riê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ốngTái sử dụng mã nguồnDễ 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ầng2 Layer / 2 Tier 3 Layer / 3 TierN Layer / N Tier Mô hình 2 tầng đơn giảnTầng giao diệnTầ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 ObjectMỗ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ảnXXXTableYYYTableZZZTableDatabaseXXXPOJOYYYPOJOZZZPOJO*.javaĐối tượng trao đổi dữ liệu (POJO) đơn giảnnhanvienphongbanNhanVienPhongBanPOJO: PhongBan 12345678910111213141516171819package 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ạopublic PhongBan() {}public PhongBan(int maPhongBan, String tenPhongBan) { this.MAPHG = maPhongBan; this.TENPHG = tenPhongBan;}// Các phương thức get/setpublic String getTenPhong() { return this.TENPHG;}public void setTenPhong (String tenphong) { this.TENPHG = tenphong;}} POJO: NhanVien 1234567891011121314151617181920package 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 CSDLMỗi DAO thường chứa những phương thức như:Thêm, xoá, sửa dữ liệuRú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) XXXDAOYYYDAOZZZDAOJDBCXXXTableYYYTableZZZTable*.javaDBPOJOsTầng dữ liệu (DAO) NhanVienDAOPhongBanDAOJDBCNhanVienPhongBan*.javaDBPOJOsNhanVienDAO.javaPhongBanDAO.javaXâ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ốiThực thi câu lệnh SQLThực thi stored procedureMySQLDataHelper – Overview 1234567891011121314151617181920package 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) 1234567891011121314151617181920package 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) 212223242526272829303132333435363738 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) 39404142434445464748495051 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) 123456789101112131415161718192021222324package 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)123456789101112131415161718192021222324 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)123456789101112131415 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)1234567891011121314 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)12345678910111213141516 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)12345678910111213141516 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ênLấy thông tin chi tiết của nhân viên dựa trên mã nhân viênKiểm tra xem nhân viên đã tồn tại chưaThêm nhân viênXóa nhân viênCập nhật nhân viên Tầng giao diện (GUI) Có nhiều loại giao diện:Giao diện WEBGiao diện WindowGiao diện Mobile Tầng giao diện (GUI)XXXDAOYYYDAOZZZDAOJDBCXXXTableYYYTableZZZTable*.javaDBPOJOsMàn hình giao diện Tầng giao diện (GUI) NhanVienDAOPhongBanDAOJDBCNhanVienPhongBan*.javaDBPOJOsNhanVienDAO.javaPhongBanDAO.javaVD 1: Chức năng Xem danh sách phòng ban PhongBanDAOPhongBanDBPB1_GetListPhongBanGUIDAOlayDanhSachPhongBan(); GUI: PB1_GetListPhongBan123456789101112131415161718192021package 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 banPhongBanDAOPhongBanDBPB2_InsertPhongBanGUIDAOthemPhongBan(); GUI: PB2_InsertPhongBan123456789101112131415161718192021package 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 banPhongBanDAOPhongBanDBPB3_UpdatePhongBanGUIDAOcapNhatPhongBan(); layPhongBan(); GUI: PB3_UpdatePhongBan12345678910111213 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_UpdatePhongBan1234567891011 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); }