mybatis foreach的使用

  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>

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

时间: 2024-08-14 02:42:39

mybatis foreach的使用的相关文章

解决mybatis foreach 错误: Parameter &#39;__frch_item_0&#39; not found

解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters

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

mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... separator设置为"union all"分割时,最终拼接的代码形式为:insert into table_name (a,b

mybatis &lt;forEach&gt;标签的使用

MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名称作为键.List 实例将会以"list"作为键,而数组实例将会以"array"作为键. foreach元素的属性主要有 item,index,collection,open,separator,close.  item表示集合中每一个元素进行迭代时的别名, index

mybatis foreach标签

一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrdergood(List<Ordergood> ordergoods){ return session.insert(Ordergood.class.getName()+".addOrdergood", ordergoods)>0; } 2.xml文件 <!--添加订单

mybatis forEach标签item影响其他标签判断的问题

mapper.xml文件中,多个标签中存在属性中使用同名变量,若前边的标签修改了变量的值,则前边的标签可能会影响后边的标签(一般是forEache标签影响后边标签),示例: 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org

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

转自:http://blog.csdn.net/wj3319/article/details/9025349 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内.它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符.这个元素是很智能的,它不会偶然地附加多余的分隔符.下面是一个演示示例:   <select id="findByIdsMap" r

mybatis foreach map list in

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性

Mybatis foreach嵌套遍历Map的key和value

最近做东西,需要向数据库存储一个保存在HashMap的key和value中的数据.具体的结构大致是Map<Object, Set<String>>. 数据库中需要保存两个个字段:1.key中对象的id,set中的多个string,显然id和set中的string是1对多的关系:需要嵌套循环. 一开始怀疑Mybatis能否做到这样灵活sql,经过尝试,证明了Mybatis的强大. 具体做法:(Oracle数据库) <insert id="saveMatchResult

mybatis foreach批量处理

---恢复内容开始--- http://blog.csdn.net/jiesa/article/details/52185617 foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.info.details.具体说明:在list和数组中是其中的对象,在map中是value.该参数为必选. collection 要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象