Bài giảng Lập trình hướng đối tượng - Bài 10: Java kết nối cơ sở dữ liệu - TS. Nguyễn Mạnh Hùng

pdf 37 trang phuongnguyen 2280
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 10: Java kết nối cơ sở dữ liệu - TS. Nguyễn Mạnh Hùng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_bai_10_java_ket_noi_co_s.pdf

Nội dung text: Bài giảng Lập trình hướng đối tượng - Bài 10: Java kết nối cơ sở dữ liệu - TS. Nguyễn Mạnh Hùng

  1. Lập trình hướng đối tượng Java kết nối cơ sở dữ liệu Giảng viên: TS. Nguyễn Mạnh Hùng Học viện Công nghệ Bưu chính Viễn thông (PTIT)
  2. Case study
  3. Bài toán đặt phòng khách sạn (1) Mô tả:  Mỗi khách sạn có nhiều phòng  Mỗi phòng có thể có nhiều khách hàng khác nhau ở các thời điểm khác nhau  Mỗi khách hàng có thể ở nhiều phòng khác nhau ở các thời điểm khác nhau  Mỗi khách hàng chỉ ở một phòng khách sạn tại một thời điểm nhất định 3
  4. Bài toán đặt phòng khách sạn (2) Yêu cầu (1):  Thiết kế các bảng CSDL và quan hệ giữa các bảng cho bài toán  Định nghĩa các lớp đối tượng cho bài toán (gọi là lớp thực thể)  Cài đặt phương thức thêm một phòng vào khách sạn, thêm một khách hàng, và thêm một phiếu đặt phòng vào CSDL  Cài đặt phương thức cập nhật thông tin của 1 khách sạn, 1 phòng, 1 khách hàng, 1 phiếu đặt phòng 4
  5. Bài toán đặt phòng khách sạn (3) Yêu cầu (2):  Cài đặt phương thức tìm kiếm phòng trống theo giá tiền, ngày check in, ngày check out  Cài đặt phương thức tìm kiếm các phiếu đặt phòng trong một của một ngày xác định  Cài đặt phương thức tìm kiếm khách hàng đặt phòng theo số phòng, hạng phòng  Cài đặt phương thức tính tổng doanh thu của khách sạn trong một khoảng thời gian nhất định 5
  6. Thiết kế CSDL
  7. Đề xuất các bảng Khách sạn (hotel): Khách hàng (customer): ID ID Name Name Level Note Description Address Phòng (room): Đặt phòng (booking): ID ID HotelID RoomID Level CustomerID Price StartDate Description EndDate Note 7
  8. Quan hệ giữa các bảng 8
  9. Thiết kế các lớp thực thể
  10. Đề xuất các lớp Khách sạn (Hotel): Khách hàng (Customer): id id name name level note description address rooms Đặt phòng (Booking): Phòng (Room): id id room level customer price startDate description endDate note 10
  11. Quan hệ giữa các lớp 11
  12. Cài đặt các lớp thực thể
  13. Lớp Hotel public class Hotel{ // lớp khách sạn private String id; // mã khách sạn private String name; // tên khách sạn private int level; // hạng khách sạn private String address; // địa chỉ private String description; // giới thiệu private Room[] rooms; // các phòng của khách sạn // các phương thức khởi tạo // các phương thức get/set } 13
  14. Lớp Room public class Room{ // lớp phòng khách sạn private String id; // mã phòng khách sạn private String level; // hạng phòng private float price; // giá phòng private String description; // giới thiệu // các phương thức khởi tạo // các phương thức get/set } 14
  15. Lớp Customer public class Customer{ // lớp khách hàng(người đặt phòng) private String id; // mã khách private String name; // tên khách private String note; // ghi chú về khách // các phương thức khởi tạo // các phương thức get/set } 15
  16. Lớp Booking public class Booking{ // lớp phiếu đặt phòng private String id; // mã phiếu private Customer customer; // khách hàng private Room room; // phòng được đặt private Date startDate; // ngày checkin private Date endDate; // ngày checkout private String note; // ghi chú // các phương thức khởi tạo // các phương thức get/set } 16
  17. Lớp ControlDB
  18. Sự cần thiết của lớp ControlDB  Các lớp vừa định nghĩa chỉ là các lớp thực thể: dùng chứa thông tin mà chưa có chức năng xử lí thông tin  Các phương thức yêu cầu trong đề bài có liên quan đến nhiều lớp thực thể khác nhau → không thể để chúng vào các lớp thực thể  → cho các phương thức liên quan đến xử lí dữ liệu vào một lớp thao tác với DB 18
  19. Lớp ControlDB public class ControlDB{ // lớp thao tác với DB private Connection conn; // connection đến DB private PreparedStatement preStmt; // câu lệnh Prepare SQL private Statement stmt; // câu lệnh xử lí SQL private ResultSet rs; // chứa kết quả trả về // các phương thức khởi tạo // không cần các phương thức get/set vì không nên chia sẻ connection ra khỏi phạm vi lớp này! } 19
  20. Phương thức nối dữ liệu public void getConnection(String dbClass, String dbUrl) { try { Class.forName(dbClass); conn = DriverManager.getConnection (dbUrl); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } } String dbClass = "com.mysql.jdbc.Driver"; String dbUrl = "jdbc:mysql://your.database.domain/yourDBname"; 20
  21. Các phương thức thêm mới khách sạn, phòng, khách hàng, phiếu đặt phòng
  22. Thêm mới 1 khách sạn (1) public int addHotel(Hotel hotel) { // insert vào một hàng mới vào bảng hotel String addString = "INSERT INTO hotel(name, level, address, description) VALUES(?,?,?,?)"; try { preStmt = conn.prepareStatement(addString); preStmt.setString(1, hotel.getName()); preStmt.setInt(2, hotel.getLevel()); preStmt.setString(3, hotel.getAddress()); preStmt.setString(4, hotel.getDescription()); preStmt.executeUpdate(); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } 22
  23. Thêm mới 1 khách sạn (2) // lấy id của hotel vừa thêm vào int hotelID; String selectStr = "SELECT SCOPE_IDENTITY(ID) FROM hotel"; try { stmt = conn.createStatement(); rs = stmt.executeQuery(selectStr); if(rs.next()){ hotelID = rs.getInt(1); } }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } 23
  24. Thêm mới 1 khách sạn (3) // insert vào các phòng của hotel vào bảng room for(int i=0; i<hotel.getRooms().length; i++){ String addString = "INSERT INTO room(hotelID, level, price, description) VALUES(?,?,?,?)"; try { preStmt = conn.prepareStatement(addString); preStmt.setInt(1, hotelID); preStmt.setString(2, hotel.getRooms()[i].getLevel()); preStmt.setFloat(3, hotel.getRooms()[i].getPrice()); preStmt.setString(4, hotel.getRooms() [i].getDescription()); preStmt.executeUpdate(); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } } return hotelID; } 24
  25. Bài tập (1) • Cài đặt phương thức thêm một khách hàng mới, một phiếu đặt phòng mới • Viết phương thức nhận dữ liệu của các đối tượng khách sạn, phòng, khách hàng, phiếu đặt phòng từ bàn phím, sau đó gọi phương thức thêm mới đối tượng vừa định nghĩa để thêm chúng vào CSDL 25
  26. Các phương thức cập nhật khách sạn, phòng, khách hàng, phiếu đặt phòng
  27. Cập nhật 1 phiếu đặt phòng public void updateBooking(Booking booking) { // cập nhật một hàng trong bảng booking với id có sẵn String updateStr = "UPDATE booking SET CustomerID = ?, RoomID = ?, startDate = ?, endDate = ?, note = ? WHERE ID = ?"; try { preStmt = conn.prepareStatement(updateStr); preStmt.setInt(1, booking.getCustomer().getID()); preStmt.setInt(2, booking.getRoom().getID()); preStmt.setDate(3, booking.getStartDate()); preStmt.setDate(4, booking.getEndDate()); preStmt.setString(5, booking.getNote()); preStmt.setInt(6, booking.getID()); preStmt.executeUpdate(); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } } 27
  28. Bài tập (2) • Cài đặt phương thức cập nhật một khách hàng, một khách sạn hoặc một phòng trong 1 khách sạn 28
  29. Các phương thức tìm kiếm khách sạn, phòng, khách hàng, phiếu đặt phòng
  30. Tìm kiếm phòng trống (1) public Room[] searchRoom(int starLevel, String roomLevel, float maxPrice, Date startDate, Date endDate) { String searchStr = "SELECT r.ID, r.level, r.price, r.description FROM hotel h INNER JOIN room r ON h.ID = r.hotelID WHERE h.level = ? AND r.level = ? AND r.price <= ? AND NOT EXISTS (SELECT * FROM booking b WHERE b.roomID = r.ID AND ((? BETWEEN b.startDate AND b.endDate) OR (? BETWEEN b.startDate AND b.endDate )))"; Room[] results = null; try { preStmt = conn.prepareStatement(searchStr); preStmt.setInt(1, starLevel); preStmt.setString(2, roomLevel); preStmt.setFloat(3, maxPrice); preStmt.setDate(4, startDate); preStmt.setDate(5, endDate); rs = preStmt.executeQuery(); 30
  31. Tìm kiếm phòng trống (2) // lấy số dòng trả về trong resultSet int rowcount = 0; if (rs.last()) { rowcount = rs.getRow(); rs.beforeFirst(); } // cấp phát bộ nhớ cho mảng kết quả results = new Room[rowcount]; int index = 0; while (rs.next()) { results[index] = new Room(); // cấp phát bộ nhớ cho ptử results[index].setID(rs.getInt(1).toString()); results[index].setLevel(rs.getString(2)); results[index].setPrice(rs.getFloat(3)); results[index].setDescription(rs.getString(4)); index++; } }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } return results; } 31
  32. Bài tập (3) • Cài đặt phương thức tìm kiếm khách hàng, khách sạn hoặc phiếu đặt phòng thỏa mãn một số tiêu chí tương ứng với thuộc tính của mỗi lớp • Viết chương trình nhập các tiêu chí tìm kiếm, sau đó gọi các phương thức tìm kiếm này, và cuối cùng là in kết quả tìm kiếm được ra màn hình 32
  33. Tính tổng doanh thu (dự kiến) theo thời gian, theo khách sạn, theo phòng
  34. Dự kiến doanh thu của ks (1) public float incomeHotel(int hotelID, Date startDate, Date endDate) { String searchStr = "SELECT SUM(r.price*(DATEDIFF(« dd », b.startDate, b.endDate))) FROM room r INNER JOIN booking b ON b.roomID = r.ID WHERE (r.hotelID = ?) AND (b.startDate BETWEEN ? AND ?)"; float result; try { preStmt = conn.prepareStatement(searchStr); preStmt.setInt(1, hotelID); preStmt.setDate(2, startDate); preStmt.setDate(3, endDate); rs = preStmt.executeQuery(); 34
  35. Dự kiến doanh thu của ks (2) if (rs.next()) { result = rs.getFloat(1); } }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); } return result; } 35
  36. Bài tập (4) • Cài đặt phương thức tính doanh thu dự kiến cho mỗi phòng theo khoảng thời gian cho trước • Viết chương trình nhập các tiêu chí tính toán doanh thu dự kiến theo thời gian, sau đó gọi các phương thức này, và cuối cùng là in kết quả ra màn hình 36
  37. Questions?