使用Mybaits批量插入List集合

本文详细解析了MyBatis框架中foreach元素的使用方法,包括其在MySQL和Oracle数据库中的应用,以及各种属性如collection、item、index、open、separator、close的作用。通过具体实例,如插入、查询和删除操作,展示了如何正确配置foreach标签以实现批量操作。

一、在MySQL数据库中

        在mysql数据库中,使用的是foreach标签。 foreach元素的属性主要有 collection,item,index,open,separator,close。

        常用的有

        item ,这个是迭代的每一个元素的代表,相当于JSTL的<foreach>标签中的 var 标签,是临时的元素的代表。迭代的时候要用上它,很容易被忽略从而报错。

        collection标签是集合的代表。如果传入的值是List集合,那么collection的值是list。如果传入的是数组,那么collection的值是array。如果在接口上定义了传递进来的参数,那么collection的值就是那么定义好的参数,比如下面的tags,不推荐使用。


 
  1. /**
  2. * @param tags 封装着这篇文章的List集合
  3. * @return
  4. */
  5. int insertArticleTag(@Param("tags")List<Tag> tags);

        index表示迭代的位置。

        open表示从什么地方开始,close表示什么地方结束

       separator表示在每次进行迭代之间以什么符号作为分隔符。MySQL中通常是",",Oracle中有时写union。(我还不懂)

        插入实例。INSERT INTO t_tag(name,articleId) VALUES('good','22') , ('nice','22'),('perfect','22')

INSERT INTO temp7(name) VALUES('a'),('B'),('C')
 

 
  1. <insert id="insertArticleTag" keyProperty="id" useGeneratedKeys="true" parameterType="java.util.List">
  2. INSERT INTO t_tag(name,articleId)
  3. VALUES
  4. <foreach collection="list" item="tag" separator="," index="index">
  5. (#{tag.name},#{tag.articleId})
  6. </foreach>
  7. </insert>

    注意:这里需要使用tag.name,我第一次写的时候,忘记了加上item中定义的临时属性,导致出错。

    查询实例:


 
  1. <select id="getRecommandArtice" resultType="com.ssi.domains.article.entity.Article">
  2. SELECT * from t_article
  3. WHERE id in
  4. <foreach collection="list" item="articleId" open="(" close=")" separator=",">
  5. #{articleId}
  6. </foreach>
  7. </select>

 

        注意:这次测试的效果发现了open与close,separator的作用。

        open是foreach代表的SQL语句的开头,close代表的是结尾,分隔符分割每个<foreach>标签的标签体

        WHERE id in  (   item1 , item2 ,item3 )

        删除实例与插入实例大同小异。比如 delete from t_tag where id in (58,59) 

二、Oracle数据库

        参考连接: Mybatis结合Oracle的foreach insert批量插入

        RelationMapping中有两个字段,分别是  currentId ,  mappingId  。当前的ID 映射多个 映射ID

Boolean InsertUserToRole(@Param("list") final List<RelationMapping> list);
 

 


 
  1. <!--批量操作list集合 -->
  2. <insert id="InsertUserToRole">
  3. insert into table
  4. (User_ID,ROLE_ID)
  5. (
  6. <foreach collection="list" close="" separator="union all" item="item" >
  7. select #{item.currentId},#{item.mappingId} from dual
  8. </foreach>
  9. )
  10. </insert>

        运行通过。在Oracle的版本中,有几点需要注意的:

        1.SQL中没有VALUES;  看上述的配置文件,确实没有像mysql中的values

        2.<foreach>标签中的(selece ..... from dual);        值非要从dual中,明明是自己指定的,或许是oracle的形式主义

        3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。    mysql中用逗号隔开

方法签名:Boolean questionnaireMappingReceiveGroup(@Param("list") 
                                  List<QuestionnaireMappingGroupEntity> mappingGroupEntities);

Oracle如何提交带主键的例子:ID从序列中获取
<insert id=“questionnaireMappingReceiveGroup” parameterType=“java.util.List”>
INSERT INTO T_QMR_QUESTIONNAIRE_GROUP
(ID,QUESTIONNAIRE_ID, RECEIVER_GROUP_ID, CREATE_DATE, CREATE_USER_ID, UPDATE_DATE,UPDATE_USER_ID)
SELECT SEQ_T_QMR.NEXTVAL ID, A.*
FROM(
<foreach collection=“list” item=“item” index=“index” separator=“UNION ALL”>
SELECT
#{item.questionnaireId} QUESTIONNAIRE_ID,
#{item.groupId} RECEIVER_GROUP_ID,
sysdate CREATE_DATE,
‘1’ CREATE_USER_ID,
sysdate UPDATE_DATE,
‘1’ UPDATE_USER_ID
FROM dual
</foreach>
)A
</insert>

 

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值