Ibatis怎么做批量更新?????

<insert id="updateStatusBatch" parameterClass="hashMap">  
update  
Question  
set  
status = #status#  
<dynamic prepend="where questionId in">  
<isNotNull property="actionIds">  
<iterate property="actionIds" open="(" close=")" conjunction=",">  
#actionIds[]#  
</iterate>  
</isNotNull>  
</dynamic>  
</insert> 

上面的解析成sql就是
update Question  set status = "OK"  where questionId in(1,2,3,4,5...)


到网上找了很多ibatis批量更新的例子,基本上都是这样,我心想难道他们做的项目中只遇到这种把in中的id的status全部更新为同一个值吗,如果每个id对应的status不同呢,怎么做,难道把sql全部放到iterate中吗,这样和for循环没什么区别,郁闷中。。。

小弟不才,刚接触ibatis,想请问ibatis是怎样做批量增改的,

PS:只是单独的ibatis项目,不和spring集成

 

4个回答

有的时候,我们需要一次性插入很多的数据或者一次性更新、删除很多的数据,这是为了提高效率。假如不用批处理 ,相当于是一条一条的插入。而批处理是一次性的修改数据,这样减少了数据库连接的消耗。
至于ibaits 执行
[code="java"]
sqlMapClient.startBatch();

.....
sqlMapClient.executeBatch();

[/code]
,我认为ibatis是对statement的addBatch()方法做了封装。源码没看过 ,但认为原理是这样。
在我做过的项目里,基本是一次性修改万级以上的数据时 会用批处理,我会把数据分多批,一批一批的处理 这样速度快。

ibatis只是对JDBC的封装,真正是否能够一次性批量操作,要看你的数据库类型!
比如:
一次插入多条数据:
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2') ,...

iBatis2通过SqlMapClient提供了一组方法用于批处理实现:
startBatch() 开始批处理
xecuteBatch() 执行批处理

[code="java"]
public void create(List replyList) {

    try {
        // 开始批处理
        sqlMapClient.startBatch();

        for (Reply reply: replyList) {
            // 插入操作
            sqlMapClient.insert("Reply.create", reply);
        }
        // 执行批处理
        sqlMapClient.executeBatch();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

[/code]

[list]
[*]
[/list]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问