我正在为一个大学从事Java项目,但我对Java没有任何了解。我简化了代码以尝试显示问题。
我从数据库中获取了一个包含一个User的ArrayList。该用户被证明存储在 users 中。
现在,调用 printArray(users)时永远不会打印此ArrayList的内容,并且找不到用户会打印到控制台,显示该数组为空,甚至但在被证明包含1个用户之前。
请在 try 部分
中查看评论public class UserInterface extends Application {
UserRepo userRepo = new UserRepo();
ArrayList<User> users = new ArrayList<>();
UserController userController = new UserController();
public static void main(String args[]) throws SQLException{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
String connectionURL = "jdbc:derby://localhost:1527/gymManager";
String userName = "root";
String userPassword= "root";
try{
Connection conn = DriverManager.getConnection(connectionURL, userName, userPassword);
if(conn != null){
//userRepo.read(conn) takes a Connection and returns an ArrayList<User>
//users contains 1 user as proven by the next line
users = userRepo.read(conn);
//this outputs proves 1 user has been loaded from the database
System.out.println("How many users loaded: " + users.size());
//takes ArrayList to printArray
printArray(users);
//printArray says "No users found indicating the users.isEmpty()"
}
}
catch(SQLException ex){
System.out.println("Exception:" + ex.toString());
}
}
public void printArray(ArrayList users){
if(users.isEmpty()){
System.out.println("No users found.");
}
for(int i = 0; i < users.size(); i++){
User currentUser = (User) users.get(i);
System.out.println("First name = " + currentUser.getFirstName());
}
}
}
public class UserRepo implements Repo {
private ArrayList<User> users = new ArrayList<>();
@Override
public ArrayList read(Connection conn) {
ArrayList list = new ArrayList();
System.out.println("Reading users from the database...");
try {
Statement st = conn.createStatement();
ResultSet rs = null;
String query = "SELECT * FROM Users";
rs = st.executeQuery(query);
while(rs.next()){
String firstName = rs.getString("firstName");
String lastName = rs.getString("lastName");
String emailAddress = rs.getString("emailAddress");
String password = rs.getString("password");
User user = new User(firstName, lastName, emailAddress, password);
list.add(user);
}
st.close();
rs.close();
} catch (SQLException ex) {
System.out.println("Exception:" + ex.toString());
}
users = list;
return users;
}
}
答案 0 :(得分:1)
显示的代码似乎没有明显的错误。但是,那里有危险点。
我认为列表users
应该位于更本地的范围内,因为我认为它已在其他地方进行了修改。
首先进行一些清理。将list
设为纯局部结果/变量可防止在未显示的代码中将其从其他位置更改。 UserRepo.users
可能已被重置,例如通过新呼叫。
@Override
public List<User> read(Connection conn) {
List<User> list = new ArrayList<>();
System.out.println("Reading users from the database...");
try {
Statement st = conn.createStatement();
String query = "SELECT * FROM Users";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
String firstName = rs.getString("firstName");
String lastName = rs.getString("lastName");
String emailAddress = rs.getString("emailAddress");
String password = rs.getString("password");
User user = new User(firstName, lastName, emailAddress, password);
list.add(user);
}
rs.close();
st.close();
} catch (SQLException ex) {
System.out.println("Exception:" + ex.toString());
}
return list;
}
您要小心地关闭Statement和ResultSet,连接可能需要同样的操作,否则第二次出现问题的查询调用可能会失败。
try{
Connection conn = DriverManager.getConnection(connectionURL, userName, userPassword);
if (conn != null){
List<User> users = userRepo.read(conn);
System.out.println("How many users loaded: " + users.size());
printArray(users);
conn.close();
}
和printArray:
public void printArray(List<User> users){
if (users.isEmpty()){
System.out.println("No users found.");
}
for (User currentUser : users) {
System.out.println("First name = " + currentUser.getFirstName());
}
}
答案 1 :(得分:-1)
在不知道userRepo.read()方法内部存在什么的情况下很难说出什么失败。 一般来说,要从数据库获取任何数据,您需要创建特定于(在您的情况下)DerbyDB的正确查询语句。
我从没使用过Derby,但是通常需要从表SELECT语句中获取数据,因此类似SELECT * from users
应该返回users
表中的所有数据。
在SELECT中,Java数据可以存储在ResultSet中,因此在代码中可能看起来像这样:
ResultSet resultSet = st.executeQuery("SELECT * FROM USERS");
下一步将调用ResultSet的next()
以及也许getString()
方法,但是在看到您的UserRepo类内容之前我们不确定。