x:batch 動作用來為 JSP SQL 動作分組。執行這個動作的原因有兩種。 一個原因是要延遲處理一組 x:updateRow、x:insertRow 和 x:deleteRow 動作,直到它們全部指定好為止。另一個原因是要讓一組動作使用相同的資料庫連線。
如果您的 JSP 頁面要使用 x:repeat 元素內的 x:insertRow 或 x:deleteRow 動作, 您必須將 x:repeat 元素放在 x:batch 動作的主體內,才能得到正確的結果。如果沒有這麼做,可能會更新或刪錯列,或使列插入錯誤位置。x:insertRow 和 x:deleteRow 動作會改變結果集中後續列的編號。藉由延遲這些動作,您可以利用現行列號來將它們的目標鎖定在各列上。 直到 x:batch 結束所有動作都處理好之後,列號才會改變。
您可以將任何動作放在 x:batch 內,但只有 x:updateRow、x:insertRow 和 x:deleteRow 動作會延遲。您也可以將不同的 DBSelect 和 DBProcedureCall Bean 所適用的動作放在 x:batch 內。
x:batch 內的所有動作都是利用相同的資料庫連線來執行的。 您可以選用地指定所有批次動作都應在相同資料庫交易內進行,且在結束之前,不進行任何確定。如果在這項交易期間發生 DataException,就會執行回復,而不執行確定。
<x:batch connectionSpec = "connectionSpec_id" connectionSpecRef = "connectionSpecRef" singleTransaction = "true|false"> </x:batch>
x:batch 動作有下列屬性:
所參照的動作會提供建立資料庫連線所需要的資訊。 所有批次動作都是利用相同連線來執行的。 如果您在 x:batch 內的任何動作中指定 connectionSpec 屬性,就會出現錯誤的旗標。
您可以指定 connectionSpec 或 connectionSpecRef,但不能同時指定這兩者。
x:batch 動作的主體中,可以有任何 JSP SQL 標示。下列動作會被延遲:
這個範例會在 select1 所產生的結果集各列中進行疊代。 如果檢查到名稱為 delete 的索引化要求參數,就會將這列刪除。
<x:batch connectionSpec= "conn1"> <x:repeat name="select1" over="rows" index="rowNumber"> <% if (request.getParameter("delete"+rowNumber)!= null) { %><x:deleteRow /> <% } %> </x:repeat> </x:batch>
這個範例會從 select1 所產生的結果集中刪除一列,再插入一列到 select2 所產生的結果集中。使用 x:batch 可讓這個動作在單一資料庫交易內完成。
<x:batch connectionSpec="conn1" singleTransaction="true"> <x:deleteRow name="select1"/> <x:insertRow name="select2"/> </x:batch>