Java JDBC选择记录

时间:2017-05-30 14:51:40

标签: java jdbc

我正在开展一个小项目,现在我遇到了问题。我需要在我的数据库中搜索所有具有相同类型的电影。我为这件事写了这个函数,但效果不好。原则上我希望找到的每个结果都创建一个名为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;
}

1 个答案:

答案 0 :(得分:3)

这里的问题是你在循环中return而不是将结果添加到List并在循环完成时返回该列表。

代码中还有其他几个与您的问题无关但可能在将来出现问题的问题:

  1. 您创建一个语句和一个结果集,但从不关闭它们。
  2. 您正在使用字符串连接来生成查询而不是PreparedStatement。如果从某个不受信任的用户(例如在Web应用程序中)收到字符串Genere,则该用户可以使用SQL注入将查询转换为他想要的任何内容。
  3. 更好的解决方案(警告:未经测试)如下所示:

    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方法。