2011-02-27 50 views
3

我有這個功能,需要使它成爲一個功能。唯一的區別是輸入變量類型sourceColumnValue。此變量可以是字符串整數但函數的返回值必須始終爲整數。 我知道我需要使用泛型但不能這樣做。在函數中使用泛型的問題

public Integer selectReturnInt(String tableName, String sourceColumnName, String sourceColumnValue, String targetColumnName) { 
    Integer returned = null; 
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue+"' LIMIT 1"; 

    try { 
     Connection connection = ConnectionManager.getInstance().open(); 
     java.sql.Statement statement = connection.createStatement(); 
     statement.execute(query.toString()); 
     ResultSet rs = statement.getResultSet(); 
     while(rs.next()){ 
      returned = rs.getInt(targetColumnName); 
     } 

     rs.close(); 
     statement.close(); 
     ConnectionManager.getInstance().close(connection); 
    } catch (SQLException e) { 
     System.out.println("Заявката не може да бъде изпълнена!"); 
     System.out.println(e); 
    } 

    return returned; 
} 


// SELECT (RETURN INTEGER) 
public Integer selectIntReturnInt(String tableName, String sourceColumnName, Integer sourceColumnValue, String targetColumnName) { 
    Integer returned = null; 
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue+"' LIMIT 1"; 

    try { 
     Connection connection = ConnectionManager.getInstance().open(); 
     java.sql.Statement statement = connection.createStatement(); 
     statement.execute(query.toString()); 
     ResultSet rs = statement.getResultSet(); 
     while(rs.next()){ 
      returned = rs.getInt(targetColumnName); 
     } 

     rs.close(); 
     statement.close(); 
     ConnectionManager.getInstance().close(connection); 
    } catch (SQLException e) { 
     System.out.println("Заявката не може да бъде изпълнена!"); 
     System.out.println(e); 
    } 

    return returned; 
} 
+0

看起來有些沮喪的精神病患者來和下投票大家([MEE太(http://stackoverflow.com/questions/5133958/problem-using-generics-in-function/5133995#5133995)): d – 2011-02-27 15:53:22

+2

切勿使用字符串連接的SQL,這是一個安全風險,反模式:http://www.ibm.com/developerworks/java/library/j-typesafejpa/也釋放宣稱資源,而不是最終的,他們嘗試塊(否則失敗將不會釋放聲稱的資源!)。 – Kdeveloper 2011-02-27 16:29:28

回答

0

無需使用通用的,你可以只使用對象作爲變量類型的功能:

public Integer selectIntReturnInt(String tableName, String sourceColumnName, Object sourceColumnValue, String targetColumnName) { 
    Integer returned = null; 
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue.toString()+"' LIMIT 1"; 

    try { 
     Connection connection = ConnectionManager.getInstance().open(); 
     java.sql.Statement statement = connection.createStatement(); 
     statement.execute(query.toString()); 
     ResultSet rs = statement.getResultSet(); 
     while(rs.next()){ 
      returned = rs.getInt(targetColumnName); 
     } 

     rs.close(); 
     statement.close(); 
     ConnectionManager.getInstance().close(connection); 
    } catch (SQLException e) { 
     System.out.println("Заявката не може да бъде изпълнена!"); 
     System.out.println(e); 
    } 

    return returned; 
} 
0

你不需要使用泛型。只需把它聲明爲

public Integer selectReturnInt(String tableName, 
     String sourceColumnName, 
     Object sourceColumnValue, 
     String targetColumnName) { 
     ... 
} 
+0

幸運的人是精神病患者忘了反對票你。 :) – 2011-02-27 15:55:19

0

有第二種方法只需要調用第一:

public Integer selectIntReturnInt(String tableName, String sourceColumnName, Integer sourceColumnValue, String targetColumnName) { 
    return selectReturnInt(tableName, sourceColumnName, sourceColumnValue.toString(), targetColumnName); 
} 
1

沒有你不需要使用泛型這個..通用時,應使用您支持的類型可以對很多人而言,並且他們在手之前不知道他們,他們分享共同的東西。

只適用於兩種類型泛型不是一個好的選擇。使用objects可能是更好的選擇。

可能我會說你甚至不需要合併這些函數,這就是多態的目的。讓事情謹慎將使代碼

0

對於愛情$神更易讀,請不要使用動態SQL。你會得到注射漏洞。

你想把它分解成(至少)三種方法。一個是實現的大部分,另一個是不同的類型。

值得注意的還有:

  • 資源處理應該是這樣的形式final Resource resource = acquire(); try { ... } finally { resource.release(); }的,或在JDK7 try (final Resource resource = acquire()) { ... }
  • 單身是魔鬼的工作。
  • 異常處理被認爲是一個好主意,而下沉到printf是壞的。
  • 你可能只關閉返回一個值更好,如果恰好有一個結果集,否則拋出異常。