我正在执行一组更新查询,这些查询是使用ibatis2在sqlserver上动态生成的。我已在中写入更新元素 sqlMap
在事务范围内执行的:
<update id="updateDepartments" parameterClass="Office">
declare @sql nvarchar(400);
<iterate property="departmentList">
<!-- form the update query and store in @sql-->
exec sp_executesql @sql
</iterate>
</update>
我有几个问题与上述查询的执行方式有关。
它们是批量执行还是单独执行,即对数据库服务器的网络调用数是否等于生成的更新查询数?
如果执行查询,客户机代码如何知道实际更新了多少行?即使更新了多行,返回值也始终显示为1。
使用ibatis2有更好的方法吗?
形成的动态更新查询示例如下:
update Department set cost1=1000 where department_name='sales'
update Department set cost2=2000 where department_name='finance'
update Department set cost3=3000 where department_name='marketing'
作为parameterClass的一部分传递的参数是包含以下内容的对象列表:
1. Department name
2. Column name to be updated
3. Value to be updated for column in 2.
example,
['sales', 'cost1', 1000]
['finance', 'cost2', 2000]
1条答案
按热度按时间dldeef671#
它可能会作为一个批处理执行,但我不确定它可以。我已经很久没用iBATIS2了。
我确信可以分别执行每个sql语句。多次调用它几乎没有开销,除非一次执行数千次更新。你是吗?
我想你每次都可以使用如下参数类调用is:
然后,Map器可能看起来像:
请注意
column
以及value
作为字符串注入(使用${}
),因为它们应该具有变量类型。然而,name
是标准的ibatis jdbc参数(使用#{}
)因为它总是一个varchar。确保注入的参数来自已知来源,而不是来自用户界面或其他外部来源;否则,您的代码将容易受到sql注入的攻击。最后,如果要更新数千行,这个解决方案仍然是好的。可以改进批处理更新,或者使用复杂的sql语句一次执行多个更新。不过,我不确定这种潜在的优化有多容易或容易出错。