我正在执行一组更新查询,这些查询是使用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>
我有几个与上述查询执行方式有关的问题。
使用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]
可能有可能将其作为批处理执行,但我不能肯定。我已经很长时间没有使用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>
注意,column
和value
作为字符串(使用${}
)injected,因为它们应该具有变量类型。但是,name
是标准iBatis JDBC参数(使用#{}
),因为它始终是VARCHAR。确保注入的参数来自已知来源,而不是来自用户界面或其他外部来源;否则,您的代码将容易受到SQL注入的攻击。
最后,如果您要更新数千行,则此解决方案仍然可以。可以改进批处理更新,或使用复杂的SQL语句一次执行多个更新。但是,我不确定这种潜在的优化有多容易或容易出错。