2017-05-30 54 views
0

我正在开发一个小项目,现在我有一个问题。我需要在我的数据库中搜索具有相同流派的所有电影。我为这件事写了这个函数,但是效果不好。原则上,我希望找到的每个结果都能创建一个名为Movie的新对象并返回给他。我测试了我的功能,但是我有两部相同的电影,他只给我一个物体。而我的问题是为什么不将所有对象返回给我?他应该归还我的所有物品。Java JDBC选择记录

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; 
} 
+2

您在使用内循环'return',所以它退出在第一iteration.Add你的对象列表,而是和循环后返回列表。 – Berger

+0

帮你一个忙,并了解PreparedStatement。你不应该选择*;拼出你想要的列。 – duffymo

回答

3

这里的问题是,你return的循环,而不是添加结果到List和循环结束时返回该列表中。

没有与未与您问题相关的代码的几个其他的问题,但可能会在未来的问题:

  1. 您创建了一个声明和一个结果,从来没有关闭它们。
  2. 您正在使用字符串连接来生成查询,而不是一个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声明(称为“尝试与资源”),确保语句和结果集.close方法被调用时该块结束。

+0

但我不想在我的函数里面添加我的列表,我只想返回所有的对象。因为我第一次按你说的去做。现在我想要另一种方法。 – Eratys

+0

返回所有对象的唯一方法是将它们放在某个容器中(一个集合类 - 一个列表,一组或类似的) – nimrodm

+0

我认为有更多的可能性。 – Eratys