mybatis中批量插入以及更新
1:批量插入
批量插入就是在预编译的时候,将代码进行拼接,然后在数据库执行
1 <insert id="batchInsert" parameterType="java.util.List"> 2 insert into table_name 3 (column1,column2,column3,column4,column5,column6,column7, 4 column8,column9,column10,column11,column12) 5 values 6 <foreach collection="list" item="item" index="index" 7 separator=","> 8 (#{item.column1},#{item.column2},#{item.column3},#{item.column4}, 9 #{item.column5},#{item.column6},#{item.column7},#{item.column8},#{item.column9}, 10 #{item.column10},#{item.column11},#{item.column12} ) 11 </foreach> 12 </insert>
以上代码在数据库拼接后的效果是:
insert into table_name (a,b,c) values (a_value,b_value,c_value),(a_value2,b_value2,c_value2),.....
2:批量更新
<update id="batchUpdate" parameterType="java.util.List"> <foreach close="" collection="list" index="index" item="item" open="" separator=";"> update table_name <set> <if test="item.column1!= null">column1= #{item.column1,jdbcType=VARCHAR},</if> <if test="item.column2!= null">column2= #{item.column2,jdbcType=VARCHAR},</if> <if test="item.column3!= null">column3= #{item.column3,jdbcType=VARCHAR},</if> <if test="item.column4!= null"> column4= #{item.column4,jdbcType=VARCHAR}, </if> </set> where column5=#{item.column5,jdbcType=VARCHAR} </foreach> </update>
更新代码也是做了一个拼接,在数据库预编译后的效果是:
update table_name set a=a_value,b=b_value where c=c_value;update table_name set a=a_value2,b=b_value2 where c=c_value2;....
3:对于数据量比较大,而且不能断定需要insert或者update时,我们可以先将表中包含这些字段值得数据取出来,然后进行比较,判断
表中是否存在,然后归类为updateList和insertList,然后在分批次处理
1 <select id="queryIsExist" parameterType="java.util.List" 2 resultType="ExistDepositDto"> 3 select column1 as column1 , column2 as column2 from 4 table_name where column3 in 5 <foreach collection="list" index="index" item="item" open="(" 6 separator="," close=")">#{item.column3}</foreach> 7 and column4 in 8 <foreach collection="list" index="index" item="item" open="(" 9 separator="," close=")">#{item.column4 } 10 </foreach> 11 12 </select>
这里的如此是list,list里面是javabean对象,其实可以使用set结合的方式,这样可以去重,但是没有找到
正确的拼接方式,就使用list<Object>作为入参的方式,
在数据库中预编译后的效果是:
select column1, column2,column3 from table_name where
column1 in ('','','') and column2 in('','','') and column3 in('','','')
这样取出来的范围比较大,然后在拿数据与取出来的数据进行比较,相同说明表里存在,不同说明不存在。