ibatis2动态更新查询执行

cczfrluj  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(456)

我正在执行一组更新查询,这些查询是使用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]
dldeef67

dldeef671#

它可能会作为一个批处理执行,但我不确定它可以。我已经很久没用iBATIS2了。
我确信可以分别执行每个sql语句。多次调用它几乎没有开销,除非一次执行数千次更新。你是吗?
我想你每次都可以使用如下参数类调用is:

class updateDptParams {
  String name;
  String column;
  String value;
  // setters & getters omitted for brevity
}

然后,Map器可能看起来像:

<update id="updateDepartment" parameterClass="updateDptParams">
  update Department set ${column}=${value} where department_name=#{name}
</update>

请注意 column 以及 value 作为字符串注入(使用 ${} ),因为它们应该具有变量类型。然而, name 是标准的ibatis jdbc参数(使用 #{} )因为它总是一个varchar。确保注入的参数来自已知来源,而不是来自用户界面或其他外部来源;否则,您的代码将容易受到sql注入的攻击。
最后,如果要更新数千行,这个解决方案仍然是好的。可以改进批处理更新,或者使用复杂的sql语句一次执行多个更新。不过,我不确定这种潜在的优化有多容易或容易出错。

相关问题