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>