Lập trình hướng đối tượng Java kết nối cơ sở dữ liệu

• 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

pdf37 trang | Chia sẻ: phanlang | Lượt xem: 2078 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Lập trình hướng đối tượng Java kết nối cơ sở dữ liệu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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) Case study 3Bà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 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 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 Thiết kế CSDL 7Đề xuất các bảng Khách sạn (hotel): ID Name Level Description Address Phòng (room): ID HotelID Level Price Description Khách hàng (customer): ID Name Note Đặt phòng (booking): ID RoomID CustomerID StartDate EndDate Note 8Quan hệ giữa các bảng Thiết kế các lớp thực thể 10 Đề xuất các lớp Khách sạn (Hotel): id name level description address rooms Phòng (Room): id level price description Khách hàng (Customer): id name note Đặt phòng (Booking): id room customer startDate endDate note 11 Quan hệ giữa các lớp 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 } 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 } 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 } 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 } 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 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! } 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"; 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(); } 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(); } 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; } 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 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(); } } 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 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(); 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; } 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 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(); 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; } 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 Questions?

Các file đính kèm theo tài liệu này:

  • pdfb10_lthdt_java_ket_noi_co_so_du_lieu_bai_tap_6969.pdf