#java #arraylist
Вопрос:
Мне нужно извлечь данные из базы данных и сохранить их в полиморфном списке массивов. База данных содержит гостей в отеле, и мне нужно показать вывод на основе выбора пользователя, например, они могут выбрать выбор 1: просмотреть всех гостей, выбор 2: просмотреть гостей STC выбор 3: Просмотреть гостя SHN Я получил правильный вывод, который мне нужен, но проблема в том, что он постоянно повторяется. Мне кажется, что я что-то упускаю из виду, но я не могу точно определить, что именно, любая помощь была бы признательна! Спасибо!
Это мой текущий код:
public class HotelGuestAppEnhanced {
ArrayList<Guest> guestList = new ArrayList<Guest>();
private Connection conn;
private Statement statement;
private ResultSet rs;
public static void main(String[] args) {
HotelGuestAppEnhanced hga = new HotelGuestAppEnhanced();
hga.start();
// start method will handle program flow, methods will be non-static
}
public void start() {
// Establish connection
try {
String connectionString = "jdbc:mysql://localhost:3306/c209ga_p3";
String userid = "root";
String password = "";
conn = DriverManager.getConnection(connectionString, userid, password);
statement = conn.createStatement();
//create a method to add the list
addtoList();
int option = -1;
while (option != 4) {
menu();
option = Helper.readInt("Enter choice > ");
if (option == 1) {
viewAllGuests();
} else if (option == 2) {
viewStaycationGuests();
} else if (option == 3) {
viewSHNGuests();
} else if (option == 4) {
rs.close();
statement.close();
conn.close();
System.out.println("Thank you for using the Hotel Guest App!");
}
}
} catch (SQLException se) {
System.out.println("Error: " se.getMessage());
}
}
private void menu() {
Helper.line(150, "=");
System.out.println("HOTEL GUEST APP ENHANCED");
Helper.line(150, "=");
System.out.println("1. View All Guests");
System.out.println("2. View Staycation Guests");
System.out.println("3. View SHN Guests");
System.out.println("4. Quit");
}
/**
*
*/
private void addtoList() {
//reading from arraylist and creating STC / SHN object
try {
String sql = "SELECT * from hotel_guests, travel_docs";
// prepares and executes sql statement
rs = statement.executeQuery(sql);
while (rs.next()) {
// process results
int ID = rs.getInt("ID");
String Name = rs.getString("Name");
String RoomNo = rs.getString("RoomNo");
String GuestType = rs.getString("GuestType");
String DiscountCode = rs.getString("DiscountCode");
int GroupSize = rs.getInt("GroupSize");
int SHNdays = rs.getInt("SHNdays");
String Description = rs.getString("Description");
if (GuestType.equalsIgnoreCase("SHN")) {
// adding SHN objects
guestList.add(new SHNGuest(ID, Name, RoomNo, GuestType, SHNdays, Description));
} else if (GuestType.equalsIgnoreCase("STC")) {
// adding STC objects
guestList.add(new STCGuest(ID, Name, RoomNo, GuestType, DiscountCode, GroupSize));
}
}
} catch (SQLException se) {
System.out.println("SQL Error: " se.getMessage());
}
}
private void viewAllGuests() {
// Write code here to display all guests
// guest registration ID, guest name, room number, and guest type
// (staycation/SHN)
System.out.println(String.format("%-10s %-20s %-20s %-20sn", "Guest ID", "Guest Name", "Room Number","Guest Type"));
for( Guest g : guestList) {
System.out.println(String.format("%-10s %-20s %-20s %-20sn", g.id,g.name,g.roomNo,g.GuestType));
}
}
// Helper.line(150, "-");
// System.out.println(output);
private void viewStaycationGuests() {
// Write code here to display only staycation guests
System.out.println(String.format("%-10s %-15s %-15s %-15s %-15s %-10sn", "Guest ID", "Guest Name", "Room Number",
"Guest Type", "Discount Code", "Group Size"));
for( Guest g : guestList) {
if ( g instanceof STCGuest) {
//casting
STCGuest s = (STCGuest) g;
System.out.println(String.format("%-10s %-15s %-15s %-15s %-15s %-10sn",s.id,s.name,s.roomNo,s.GuestType,s.getA(),s.getB()));
}
}
//
}
private void viewSHNGuests() {
System.out.println(String.format("%-10s %-15s %-15s %-15s %-25s %-10sn", "Guest ID", "Guest Name",
"Room Number", "Guest Type", "Stay Home Notice Days", "Travel Documents Type"));
for (Guest g : guestList) {
if ( g instanceof SHNGuest) {
//casting
SHNGuest s = (SHNGuest) g;
System.out.println(String.format("%-10s %-15s %-15s %-15s %-25s %-10sn", s.id,s.name,s.roomNo,s.GuestType,s.getB(),s.getA()));
}
}
}
}
Это результат, который я получил:
Выбор 1 выход
Выбор 2 выход
Далее следует схема базы данных hotel_guests
travel_docs
Ответ №1:
Вы не поделились своей схемой базы данных, но, похоже, это проблема с вашим SQL-запросом
String sql = "SELECT * from hotel_guests, travel_docs";
Это фактически декартово произведение, потому что в нем отсутствует предикат соединения, то есть каждая строка hotel_guests будет соединена с каждой строкой travel_docs.
Чтобы решить эту проблему, вам нужно определить условие соединения, возможно, у вас есть идентификатор гостя в обеих таблицах, тогда вы можете сказать
SELECT * from hotel_guests JOIN travel_docs on hotel_guests.guest_id = travel_docs.guest_id"
Редактировать :
После просмотра схемы вашей базы данных, которой вы только что поделились, мне кажется, что вы хотите получить описание путешествия, в этом случае вам следует использовать следующий запрос
SELECT * from hotel_guests JOIN travel_docs on hotel_guests.TravelDocId = travel_docs.ID
Комментарии:
1. привет, спасибо за ваш ответ! я отредактировал свой код на основе того, что вы сказали, но теперь я не вижу никаких выходных данных из базы данных :/
2. Вам нужно поделиться своей схемой базы данных
3. я только что загрузил фотографии из базы данных 🙂
4. обе ваши таблицы кажутся идентичными, почему вы должны извлекать данные из них обоих?
5. потому что, если я хочу просматривать только гостей STC, мне нужно указать тип проездных документов, который находится в таблице travel_docs (описание), а не в таблице hotel_guests
Ответ №2:
Я полагаю while
if
, что вместо этого можно использовать проблему с циклом.