foreach标签在批量插入数据库时非常方便,但是很容易出错,我没有注意括号的位置让我折腾了一个半小时找问题,醉醉哒,所以在这里记录一下foreach的使用。

首先,这是insert批量插入正确的代码:

<insert id="insertList" parameterType="map" useGeneratedKeys="true" keyProperty="messageId" >
insert into message_table (
message_id
to_member_id,
message_title,
message_body,
message_time,
message_update_time,
message_state,
message_type,
read_member_id,
del_member_id,
to_member_name,
create_time,
type_sn,
type )values
<foreach collection="messageLt" item="m" separator="," >
(#{m.messageId},
#{m.toMemberId},
#{m.messageTitle},
#{m.messageBody},
UNIX_TIMESTAMP(NOW()),
#{m.messageUpdateTime},
#{m.messageState},
#{m.messageType},
#{m.readMemberId},
#{m.delMemberId},
#{m.toMemberName},
UNIX_TIMESTAMP(NOW()),
#{m.typeSn},
#{m.type})
</foreach> </insert>

我犯的错误是:

  insert tableName(
)values(
<foreach collection="messageLt" item="m" separator="," open="(" close=")" >
</foreach>
)

产生的SQL结果是:insert tableName(a,b,c)values((?,?,?),(?,?,?),(?,?,?))

报错原因插入行数不对应,正常结果应该是  insert tableName(a,b,c)values(?,?,?),(?,?,?),(?,?,?)。比较可以很明显看出问题。

下面是select的foreach使用:

<select id="selectBatchMCoupon" parameterType="map" resultMap="memberCouponResultMap">
select
mc.mcoupon_id,
mc.member_id,
mc.coupon_id,
mc.mcoupon_create_time,
mc.class_show,
c.coupon_title
from
member_coupon mc
left join eland_coupon c on c.coupon_id=mc.coupon_id
where 1=1 and mc.class_show=0 and
<if test="couponLt != null and couponLt != ''">
mc.coupon_id in
<foreach collection="couponLt" item="coupon" open="(" close=")" separator=",">
#{coupon}
</foreach> </if>
</select>

我犯的错误是:

 <if test="couponLt != null and couponLt != ''">
<foreach collection="couponLt" item="coupon" open="(" close=")" separator=",">
mc.coupon_id = #{coupon}
</foreach> </if>

这个错误犯的我都尴尬。。。

mybatis foreach的使用的更多相关文章

  1. 解决mybatis foreach 错误: Parameter '__frch_item_0' not found

    解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spr ...

  2. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  3. mybatis foreach报错It was either not specified and/or could not be found for the javaType Type handler

    或许是惯性思维,在mybatis使用foreach循环调用的时候,很多时候都是传一个对象,传一个List的情况很少,所以写代码有时候会不注意就用惯性思维方法做了. 今天向sql传参,传了一个List作 ...

  4. Mybatis foreach标签含义

    背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...

  5. mybatis foreach 循环 list(map)

    直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...

  6. mybatis <forEach>标签的使用

    MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名 ...

  7. myBatis foreach详解【转】

    MyBatis的foreach语句详解 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,ope ...

  8. MyBatis foreach标签遍历数组

    有时候开发中需要根据多个ID去查询,可以将ID封装为List或者数组然后使用MyBatis中的foreach标签构建in条件. 这里我将ID封装为String[]作为参数. <select id ...

  9. mybatis ForEach Collection集合等规范解析(转)

    转自:http://blog.csdn.net/wj3319/article/details/9025349 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了fo ...

  10. mybatis foreach标签

    一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...

随机推荐

  1. ODP方式,大批量数据写入ORACLE数据库

    项目中在同步数据的时候,需要把获得的数据DataTable,写入oracle数据库 因为System.Data.OracleClient写入方式写入大批量数据特别慢,改用Oracle.DataAcce ...

  2. js 获取滚动条的高度 以及 设置滚动条的高度

    //设置窗口滚动条高度 function setScrollTop(top){ if(!isNaN(top))document.body.scrollTop = top; } //取窗口滚动条高度 f ...

  3. 使用struts的logic:iterate标签遍历列表时得到显示序号

    <logic:notEmpty name="sList" scope="request"> <logic:iterate id="e ...

  4. django学习遇到的问题解决方式

    1.django.core.exceptions.ImproperlyConfigured: The TEMPLATE_DIRS setting must be a tuple. Please fix ...

  5. java内存泄漏的定位与分析

    1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...

  6. Java提高篇——单例模式

    介绍 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要 ...

  7. C# 与数据库中字段类型 Int16(short), Int32(int), Int64(long)的取值范围、区别 。string长度

    一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等 ...

  8. Let’s Encrypt 配置

    刚配置了下Let's Encrypt,chrome浏览器里有绿条出来,看官网其它平台问题应该也不大.我还没有研究这个工作原理,关键是刚花了几千块给公司买了个收费的证书认证.这里写下配置过程(https ...

  9. 给php添加ssl证书

    composer下载时报错: The "https://packagist.org/packages.json" file could not be downloaded: SSL ...

  10. spring的多个PropertyPlaceholderConfigurer实例装配的问题

    1. 默认情况下,使用PropertyPlaceholderConfigurer多实例装配出现异常 在项目中尝试 在不同的spring的配置文件中分别引入相应的properties文件,这样会在spr ...