ibatis对MySQL数据库的批量操作

时间:2022-12-27 21:41:52

对于批量操作,iBATIS提供了两种方式:

    使用iterate标签,进行批量插入操作;

    使用普通的SQL调用,提交时使用batch提交。

下面一一介绍:

1、使用iterate标签,进行批量插入操作

   将需要插入的Java Object封装到一个java.util.List集合中,然后调用SQL插入。这种方式主要利用iBATIS提供的iterate标签。例子如下:(下面例子中的list只是一个别名,可以更改)

可参考:http://patternhe.iteye.com/blog/960441

<insert id="addList" parameterClass="java.util.List">
<![CDATA[
insert into t_test(field1, field2, field3)values
]]>
<iterate conjunction=",">
<![CDATA[
(#list[].field1#, #list[].field2#, #list[].field3#)
]]>
</iterate>
</insert>
2、使用batch提交方式

      这个需要修改Dao层方法,下面代码是修改后的dao层代码,入参list为需要进行批量操作的Java Object集合,入参sqlId是要对list集合中每个对象要进行的操作的SQL(sqlId为iBATIS XML配置文件中的SQL对应的id)。例如SQL要进行更新操作,那么调用这个批量操作,会对list中的各个对象分别进行更新操作。

注意下面代码中的getSqlMapClient方法,使用iBATIS项目中应该都会注入这个对象。

可参考:http://salouhim.iteye.com/blog/1124661

public void batchOpt(final List<Object> list, final String sqlId ) throws Exception
{
SqlMapClient smc = etSqlMapClient();
SqlMapClientTemplate client = new SqlMapClientTemplate();
client.setSqlMapClient(smc);
client.execute(new SqlMapClientCallback<Object>() {
public Object doInSqlMapClient(SqlMapExecutor exec)
throws SQLException {
exec.startBatch();
final int batchSize = 100;
for (int i = 0; i < list.size(); i++)
{
exec.insert(sqlId, list.get(i));

if (i % batchSize == 0)
{
exec.executeBatch();
}
}
exec.executeBatch();
return null;
}

});
}
批量操作调用的SQL

<update id="updateObj" parameterClass="list集合中对象的类型">
update t_test set field1 = #field1# , field2 = #field2# where field3 = #field3#
</update>