IBatis2动态更新查询执行

问题描述 投票:0回答:1

我正在执行一组更新查询,这些查询是使用iBatis2在SQL Server上动态生成的。我在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. 它们是成批执行还是单独执行,即,对数据库服务器的网络调用数量是否等于生成的更新查询数量?
  2. 如果执行查询,客户端代码如何知道实际上更新了多少行?即使更新了多行,返回值也始终显示为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'

作为paramterClass的一部分传递的参数是包含以下内容的对象的列表:

 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]
sql database mybatis ibatis
1个回答
0
投票

可能有可能将其作为批处理执行,但我不能肯定。我已经很长时间没有使用iBatis 2了。

我确定可以正常运行的是分别执行每个SQL语句。多次调用几乎没有开销,除非您一次执行数千次更新。是吗?

我认为您每次都可以使用参数类来调用:

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

然后,映射器可能看起来像:

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

注意,columnvalue作为字符串(使用${}injected,因为它们应该具有变量类型。但是,name标准iBatis JDBC参数(使用#{}),因为它始终是VARCHAR。确保注入的参数来自已知来源,而不是来自用户界面或其他外部来源;否则,您的代码将容易受到SQL注入的攻击。

最后,如果您要更新数千行,则此解决方案仍然可以。可以改进批处理更新,或使用复杂的SQL语句一次执行多个更新。但是,我不确定这种潜在的优化有多容易或容易出错。

© www.soinside.com 2019 - 2024. All rights reserved.