2014-10-31 75 views
0

問題:我處理大量更新語句,此時我將其添加到ArrayList,然後將數組列表傳遞給循環所有更新語句的函數。他們沒有準備。通用準備語句更新

你會如何解決這個問題?我正在考慮「通用」更新功能,它接收表格和參數列表,然後「準備」所有內容。

public void updateFromList(ArrayList<String> updateQueriesList) { 
    try { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     Connection con = DriverManager.getConnection("jdbc:oracle:thin:@:1521:", "", ""); 

     PreparedStatement pstmt = null; 

     for (String s : updateQueriesList) { 
      pstmt = con.prepareStatement(s); 
      pstmt.addBatch(); 
     } 

     pstmt.executeBatch(); 

     con.close(); 
     } 

    } catch (Exception ex) { 
    } 
} 

回答

0

我不確定你問的是否真的有可能。至少不容易,沒有一些解決不好的代碼的工作。

我的建議是爲每個要更新的表創建一個「主要」更新語句。每桌一個功能。然後,您將傳遞用於準備聲明的對象,而不管它們可能包含哪些信息。然後,您將遍歷對象列表並在每個對象上調用「主要」更新語句。

在此解決方案中,您不會將任何語句添加到列表中,您的主要功能中只有一個語句適用於該表中可能會出現的所有數據。

實施例:

public class ObjectToBeUpdated 
{ 
    //data 
    //getters and setters 
} 

public void updateObject(ObjectToBeUpdated object) { 
    Connection connection = null; 
    try { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     connection = DriverManager.getConnection("jdbc:oracle:thin:@:1521:", "", ""); 

     String sql = UDPATE_STATEMENT with ? for parameters 

     PreparedStatement preparedStatement = connection.prepareStatement(sql); 
     preparedStatement.setInt(1, object.getValue1()); //etc 
     //get all values from object passed in and set them in order 

     preparedStatement.executeUpdate(); 
     connection.commit(); 

     connection.close(); 
     } 

    } catch (Exception ex) { 
    } 
    finally { 
     connection.close(); 
    } 
} 

這是做了很多的允許可讀且非常易於管理代碼,只有在一個時間以適用於一種類型的對象/表的應用程序的一種非常常見的方式。