ibatis 批量update操作

<!--批量修改菜品原价和现价--><updateid="batchUpdateDish"parameterType="java.util.List"><foreachc... <!-- 批量修改菜品原价和现价 -->
<update id="batchUpdateDish" parameterType="java.util.List" >
<foreach collection="list" item="item" index="index" separator=";" >
UPDATE T_DM_DISH D
<set>
<if test="item.price != null ">
D.PRICE = #{item.price,jdbcType=NUMERIC},
</if>
<if test="item.discountPrice != null ">
D.DISCOUNT_PRICE = #{item.discountPrice,jdbcType=NUMERIC},
</if>
</set>
WHERE D.DISH_ID = '${item.dishId}'
</foreach>
</update>
--------------------------------------------------------------------------------------------
总是报错
### SQL: UPDATE T_DM_DISH D SET D.PRICE = ?, D.DISCOUNT_PRICE = ? WHERE D.DISH_ID = '3A81D31BEA0A44AB987BE4AC0B7AE23A' ; UPDATE T_DM_DISH D SET D.PRICE = ?, D.DISCOUNT_PRICE = ? WHERE D.DISH_ID = '4D80AEFE75A446DF8DE09778BB008497'
### Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
明明是没有start 和end
展开
 我来答
还的和bk
2016-06-24 · TA获得超过612个赞
知道小有建树答主
回答量:1296
采纳率:75%
帮助的人:331万
展开全部
上面的解析成sql就是
update Question?? set status = "OK"?? where questionId in(1,2,3,4,5...)
PS:只是单独的ibatis项目,不和spring集成??问题补充:<div class="quote_title"rensanning 写道</div<div class="quote_div"ibatis只是对JDBC的封装,真正是否能够一次性批量操作,要看你的数据库类型! /比如: / 一次插入多条数据: /INSERT INTO t (t.a, t.b, t.c) /VALUES ('key1','key2','value'), ('key1','key3','value2') ,... / /</div / / /这些明白,少量数据可以用循环来执行,如果是大量数据,在ibatis中是怎么优化的,放到同一个session中吗???问题补充:<div class="quote_title"makemyownlife 写道</div<div class="quote_div"iBatis2通过SqlMapClient提供了一组方法用于批处理实现: /startBatch() 开始批处理 /xecuteBatch() 执行批处理 / /<pre name="code" class="java"
public void create(List<Reply> replyList) {try {// 开始批处理
sqlMapClient.startBatch();
for (Reply reply: replyList) {
// 插入操作
sqlMapClient.insert("Reply.create", reply);}// 执行批处理
sqlMapClient.executeBatch();
e.printStackTrace();}}</pre</div / / /首先不加这两个,红色部分也可以正常执行批量插入,差别就是加了startBatch() && sqlMapClient.executeBatch(),这样的好处能说下吗?问题补充:<div class="quote_title"makemyownlife 写道</div<div class="quote_div"iBatis2通过SqlMapClient提供了一组方法用于批处理实现: /startBatch() 开始批处理 /xecuteBatch() 执行批处理 / / / public void create(List<Reply> replyList) { / / try { / // 开始批处理 / sqlMapClient.startBatch(); / / <span style="color: red"for (Reply reply: replyList) { / // 插入操作 / sqlMapClient.insert("Reply.create", reply); / }</span / // 执行批处理 / sqlMapClient.executeBatch(); / / } catch (Exception e) { / e.printStackTrace(); / } / } / / /</div / /
miaoch
2016-06-24 · TA获得超过1204个赞
知道小有建树答主
回答量:814
采纳率:83%
帮助的人:338万
展开全部
可能是单引号的问题,WHERE D.DISH_ID = '${item.dishId}'

你把引号去掉试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loudlyrailwayt
2016-06-24 · 超过40用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:83.8万
展开全部
有的时候,我们需要一次性插入很多的数据或者一次性更新、删除很多的数据,这是为了提高效率。假如不用批处理 ,相当于是一条一条的插入。而批处理是一次性的修改数据,这样减少了数据库连接的消耗。
至于ibaits 执行

Java代码
sqlMapClient.startBatch();
.....
sqlMapClient.executeBatch();

,我认为ibatis是对statement的addBatch()方法做了封装。源码没看过 ,但认为原理是这样。
在我做过的项目里,基本是一次性修改万级以上的数据时 会用批处理,我会把数据分多批,一批一批的处理 这样速度快。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式