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 - Nguyễn Mạnh Hùng

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 
pdf 37 trang thiennv 07/11/2022 6680
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 - Nguyễn Mạnh Hùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đí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 - Nguyễn Mạnh Hùng

  1. Quan hệ giữa các lớp 11
  2. Cài đặt các lớp thực thể
  3. 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
  4. 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
  5. 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
  6. 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
  7. Lớp ControlDB
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. Tính tổng doanh thu (dự kiến) theo thời gian, theo khách sạn, theo phòng
  24. 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
  25. 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
  26. 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
  27. Questions?