2010-09-14 29 views
2

我有一個返回查詢結果的函數。輸入參數是SQL語句和要檢索的字段,而輸出是查詢的結果。正如所料,數據庫包含多種數據類型。有沒有一個通用的返回類型,我可以指定的功能?如何解釋Java函數的未知返回類型

下面的代碼檢索字符串...我需要改變這個返回Integer類型,最好不寫另一個函數。

public static String dbConnect(String sql,String field) throws SQLException, ClassNotFoundException { 
    Statement stmt; 
    String DB_URL; 
    Class.forName("com.mysql.jdbc.Driver"); 
    DB_URL="jdbc:mysql://connectionURL.net:3306/db?autoReconnect=true"; 
    Connection conn =DriverManager.getConnection(DB_URL,DB_USER, DB_PWD); 
     stmt = conn.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    String result=null; 
    while(rs.next()){ 
      result = rs.getString(field); 
    } 
    rs.close(); 
    stmt.close(); 
    conn.close(); 
    return result; 
} 

回答

4

的可能是一個更好的方式來做到這一點,但你總是可以有你的函數返回一個Object - 那麼這將有被丟在任何你真正希望得到的。

但是,如果你這樣做,也許有多種方法的各種數據類型,你可能會更容易。

(順便說一句,重新連接到數據庫爲您運行的每個查詢似乎是一個壞主意。)

1

一種含粗的解決辦法是返回一個對象,而不是字符串或Integer.Later可以鍵入它轉換可以是字符串或整數(有if語句並使用instanceOf())

4

可能最好的方法是使用兩種不同的方法調用同一個「基」方法。

public static ObjectThatCanGetItemAsAnything getItemGenerator(){ 
    return objectThatCanGetItemAsAnything; 
} 

public static String getItemAsString(){ 
    return getItemGenerator().getStringValue(); 
} 

public static String getItemAsInteger(){ 
    return getItemGenerator().getIntegerValue(); 
} 

String lol = MyClass.getItemAsString(); 
Integer test = MyClass.getItemAsInteger(); 

另一種方法是有泛型方法,這樣你可以調用getItem(),它會回報你想要的類型。

public static <T> T getItem(){ 
    return (T) myObject; 
} 

String lol = MyClass.<String>getItem(); 
Integer test = MyClass.<Integer>getItem(); 

您也可以返回Object(上述方法將像這個,如果你不設置仿製藥),後來在應用程序中投放。

public static Object getItem(){ 
    return myObject; 
} 

String lol = (String) MyClass.getItem(); 
Integer test = (Integer) MyClass.getItem(); 
+0

5年遲到了,但剛開始幾個月前學習了java。在你最後的例子中。對於正在播放的本地變量,@SuppressWarnings(「unchecked」)是否會出現這種情況?這一直是我僅僅使用動態語言而掙扎的東西。 – ptierno 2015-10-15 04:39:22

1

errr,你有一個連接功能,沒有連接,它正在連接,然後執行。不如把所有的代碼執行這一職能的,只是有它做連接:

public static Connection dbConnect() throws SQLException, ClassNotFoundException { 

    String DB_URL; 
    Class.forName("com.mysql.jdbc.Driver"); 
    DB_URL="jdbc:mysql://connectionURL.net:3306/db?autoReconnect=true"; 
    Connection conn =DriverManager.getConnection(DB_URL,DB_USER, DB_PWD); 
    return conn; 

} 

然後作出一個新的函數來執行:

public String execute(String sql,String field, Connection conn) 
{ 
    Statement stmt; 
     stmt = conn.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    String result=null; 
    while(rs.next()){ 
      result = rs.getString(field); 
    } 
    rs.close(); 
    stmt.close(); 
    return result; 
} 

然後進行調用的代碼轉換字符串爲int如果需要的話

Connection conn = MyClass.dbConnect(); 
result = mything.execute(someSql, field, conn); 
Integer i = Integer.pareseInt(result);