mybatis---------insert,delete ,update的批量操作

Posted 大兴兴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis---------insert,delete ,update的批量操作相关的知识,希望对你有一定的参考价值。

在数据量大的情况下,可以使用批量 提高性能

批量插入insert

方法一:

<insert id="insertbatch" parameterType="java.util.List">

  <selectKey keyProperty="id" order="AFTER"

  resultType="int">

  SELECT LAST_INSERT_ID()

  </selectKey>

   INSERT INTO  sourcedoc (
sdate, sweek, 
      roomno, daysched, nightsched, 
      adminsched, vacationsched, programdept, 
      programname 
)values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.sdate},#{item.sweek},#{item.roomno},
#{item.daysched},#{item.nightsched},#{item.adminsched},
#{item.vacationsched},#{item.programdept},#{item.programname}
        )
</foreach> </insert>

 

 

 

 

方法二:

 

<insert id="batchInsert" parameterType="ArrayList">
insert into table1(sdate,sweek,roomno,daysched,nightsched,adminsched,vacationsched,programdept,programname)
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.sdate,jdbcType=VARCHAR},
#{item.sweek,jdbcType=VARCHAR},
#{item.roomno,jdbcType=VARCHAR},
#{item.nightsched,jdbcType=VARCHAR},
#{item.adminsched,jdbcType=VARCHAR},
#{item.vacationsched,jdbcType=VARCHAR},
#{item.programdept,jdbcType=VARCHAR},0,0,
#{item.programname,jdbcType=VARCHAR} from dual
</foreach>
</insert>

 

 

 

批量删除(delete) 

 

<!-- 通过主键集合批量删除记录 -->

 

<delete id="batchRemoveUserByPks" parameterType="java.util.List"> 

 

DELETE FROM LD_USER WHERE ID in  

 

<foreach item="item" index="index" collection="list" open="(" separator="," close=")"> 

 

#{item} 

 

</foreach>

 

</delete>

 

 

 

 

批量修改(update) 

 


 update orders set state = ‘0‘ where no in
 <foreach collection="list" item="nos" open="(" separator="," close=")">
  #{nos}
 </foreach>
 </update>

 

 

MyBatis中in子句  in 参数 使用方法

 

1.只有一个参数 

 

参数的类型要声明为List或Array 

 

Sql配置如下: 

 

<select id="selectProduct" resultMap="Map"> 

 

SELECT * FROM PRODUCT 

 

WHERE PRODUCTNO IN

 

      <foreach item="productNo" index="index" collection="参数的类型List或array">

 

                   #{productNo}

 

     </foreach>

 

</select>

 

 

2.多个参数 

 

首先要将多个参数写入同一个map,将map作为一个参数传入mapper 

 

Sql配置如下: 

 

<select id="selectSoucedoc" resultMap="Map"> 

 

SELECT * 

 

FROM PRODUCT 

 

WHERE PRODUCTNO IN 

 

     <foreach item="id" index="index" collection="map中集合参数的名称"> 

 

            #{id} 

 

    </foreach> 

 

</select>

 

##############

 

    1. <insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List">  
    2.     <selectKey resultType="long" keyProperty="id" order="AFTER">  
    3.         SELECT  
    4.         LAST_INSERT_ID()  
    5.     </selectKey>  
    6.     insert into t_train_record (add_time,emp_id,activity_id,flag)   
    7.     values  
    8.     <foreach collection="list" item="item" index="index" separator="," >  
    9.         (#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})  
    10.     </foreach>  
    11. </insert>

 

对于foreach标签的解释参考了网上的资料,具体如下:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,

close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,

但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

 

1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

 

 

 

 

 

 

 

 

 































以上是关于mybatis---------insert,delete ,update的批量操作的主要内容,如果未能解决你的问题,请参考以下文章

mybatis insert 返回主键 的before 和after的区别

mybatis学习 -每天一记 mybatis insert null 报错

Mybatis Insert 返回主键ID

PostgreSQL使用MyBatis,insert时返回主键

mybatis insert 返回主键

mybatis insert 如何返回主键