2011-11-30 81 views
1

我有兩列在我的表「res_allocation」,一個「ResName」和其他「PID」,「ResName」將有多個值爲單個「PID」。如何根據一個值更新表的多個行?

是否有單個查詢更新基於PID的多行中的「ResName」值?

「ResName」的新值會動態顯示,即其用戶輸入。我使用SQL數據庫。

+0

ResName將具有不同的值 – Vinod

回答

1

這已經改編自我已有的代碼......可能有一兩個錯誤,但癥結將起作用(它在我的代碼中起作用)。理想情況下,像這樣的事情應該使用像Hiberante這樣的ORM工具來完成。

基本上你設置了批量更新,然後運行statement.executeBatch()來做實際的更新。您將返回一個帶結果的int []數組。您根據預定義的常量列表來檢查這些常量,看看發生了什麼。這比單獨執行每個更新要快得多。此外,您可以在一個事務中合併所有更新,使回滾更容易。

public void updateResNames(List<ResAllocationDTO> list) { 
    String sql = "UPDATE res_allocation SET ResName = ? WHERE PID = ?"; 
    PreparedStatement statement = null; 
    try { 
     statement = connection.prepareStatement(sql); 
     for (ResAllocationDTO dto : list) { 
      statement.setString(1, dto.getResName()); 
      statement.setString(2, dto.getPID()); 
      statement.addBatch(); 
     } 
     int[] result = statement.executeBatch(); 
     for (int i = 0; i < result.length; i++) { 
      if (result[i] == PreparedStatement.EXECUTE_FAILED) { 
       throw new SQLException(String.format("Entry %d failed to execute in the batch insert with a return code of %d.", i, result[i])); 
      } 
     } 
     commit(); 
    } catch (SQLException e) { 
     logger.error(LoggerCodes.DATABASE_ERROR, e); 
     rollback(); 
     throw new RuntimeException(e); 
    } finally { 
     close(statement); 
    } 
} 

提交(),關閉()和rollback()看起來是這樣的:

public void close(PreparedStatement statement) { 
    try { 
     if (statement != null && !statement.isClosed()) 
      statement.close(); 
    } catch (SQLException e) { 
     logger.debug(LoggerCodes.TRACE, "Warning! PreparedStatement could not be closed."); 
    } 
} 

protected void commit() { 
    try { 
     if ((connection != null) && !connection.getAutoCommit()) { 
      connection.commit(); 
     } 
    } catch (SQLException e) { 
     logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after commit."); 
    } 
} 

protected void rollback() { 
    try { 
     if ((connection != null) && !connection.getAutoCommit()) { 
      connection.rollback(); 
     } 
    } catch (SQLException e) { 
     logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after rollback."); 
    } 
} 

我希望這可以幫助你!祝你好運,快樂的編碼!

+0

此查詢更新「ResName」在所有行中相同,我需要更新不同行中的不同值,並且這些不同的值來自用戶選擇。 – Vinod

+0

在這種情況下,我會使用批量更新。你使用直接JDBC嗎? –

+0

是的...... mysql.jdbc.Driver 我不知道什麼是批量更新,請問您能否簡單回答一下。 – Vinod

相關問題