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
37 trang |
Chia sẻ: phanlang | Lượt xem: 2063 | Lượt tải: 2
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:
- b10_lthdt_java_ket_noi_co_so_du_lieu_bai_tap_6969.pdf