我正在开展一个小项目,现在我遇到了问题。我需要在我的数据库中搜索所有具有相同类型的电影。我为这件事写了这个函数,但效果不好。原则上我希望找到的每个结果都创建一个名为Movie的新对象并返回给他。我测试了我的功能,但我有两部同样的电影,他只给我一个对象。我的问题是为什么不归还我的所有物品?他应该归还我的所有物品。
public Movie extraction(String Genre)throws SQLException{
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from movies where genre='"+Genre+"'");
while(rs.next()){
String name=rs.getString("name");
String genre=rs.getString("genre");
int year=rs.getInt("year");
int metascore=rs.getInt("metascore");
System.out.println(name);
return new Movie(name,genre,year,metascore);
}
return null;
}
答案 0 :(得分:3)
这里的问题是你在循环中return
而不是将结果添加到List
并在循环完成时返回该列表。
代码中还有其他几个与您的问题无关但可能在将来出现问题的问题:
PreparedStatement
。如果从某个不受信任的用户(例如在Web应用程序中)收到字符串Genere
,则该用户可以使用SQL注入将查询转换为他想要的任何内容。更好的解决方案(警告:未经测试)如下所示:
List<Movie> movies = new ArrayList<>();
try(PreparedStatement stmt= con.prepareStament("select * from movies where genre=?")) {
stmt.setString(1, Genere);
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()){
String name=rs.getString("name");
String genre=rs.getString("genre");
int year=rs.getInt("year");
int metascore=rs.getInt("metascore");
movies.add(new Movie(name,genre,year,metascore));
}
}
}
return movies;
try
语句(称为“try with resources”)确保在块结束时调用语句和结果集.close
方法。