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ươ
Trang 1Lậ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)
Trang 2Case study
Trang 4Bà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
Trang 5Bà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
Trang 6Thiết kế CSDL
Trang 7Đặt phòng (booking):
ID RoomID CustomerID StartDate EndDate Note
Trang 8Quan hệ giữa các bảng
Trang 9Thiết kế các lớp thực thể
Trang 10Đặt phòng (Booking):
id room customer startDate endDate note
Trang 11Quan hệ giữa các lớp
Trang 12Cài đặt các lớp thực thể
Trang 13Lớ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
}
Trang 14Lớ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
}
Trang 15Lớ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
}
Trang 16Lớ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
}
Trang 17Lớp ControlDB
Trang 18 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
Trang 19Lớ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!
}
Trang 20Phương thức nối dữ liệu
public void getConnection(String dbClass , String dbUrl ) {
Trang 21Các phương thức thêm mớikhách sạn, phòng, khách hàng, phiếu đặt phòng
Trang 22Thê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());
Trang 23e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
Trang 24Thê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());
Trang 26Các phương thức cập nhậtkhách sạn, phòng, khách hàng, phiếu đặt phòng
Trang 27Cậ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());
Trang 28Bà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
Trang 29Các phương thức tìm kiếmkhách sạn, phòng, khách hàng, phiếu đặt phòng
Trang 30Tì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();
Trang 31} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (SQLException e) { e.printStackTrace();
}
return results;
}
Trang 32Bà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
Trang 33Tính tổng doanh thu (dự kiến)
theo thời gian, theo khách sạn, theo phòng
Trang 34Dự 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();
Trang 36Bà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
Trang 37Questions?