2017-05-30 44 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