天天看點

SSM Mybatis 中傳入List實作 批量插入、批量更新、批量删除

上代碼(Service和ServiceImpl 省略):

1. 批量插入:

Mapper層:

int insertList(List<UsersModel> list);      

對應的mapper.xml:

<!--批量插入資訊-->
  <insert id="insertList" parameterType="java.util.List">
    insert into users(
    id, name
    )
    values
    <foreach collection="list" item="item" index="index" separator=",">
      (
      #{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}
      )
    </foreach>
  </insert>      

如果List資料量比較大,可以考慮将List分批次插入

2. 批量更新:

批量更新隻提供更新單個字段的,因為更新多個字段無論哪種批量更新方案,我都用起來很不舒服,是以不做提供。

Mapper層:

int updateList(List<AgentApply> list);      

對應的mapper.xml:

<!--批量更新-->
  <update id="updateList" parameterType="java.util.List">
    update agent_apply
    set apply_time=
    <foreach collection="list" item="item" index="index"
             separator=" " open="case" close="end">
      when id=#{item.id} then #{item.applyTime}
    </foreach>
    where id in
    <foreach collection="list" index="index" item="item"
             separator="," open="(" close=")">
      #{item.id,jdbcType=INTEGER}
    </foreach>
  </update>      

3. 批量删除:

PS:一般查詢出來的List都是包含對象在裡面的,那麼怎麼清理出單獨包含ID的list呢?

可以參考下面方式,第一個listData是從資料庫查詢出來的list資料,每個元素都是一個對象;

然後單獨把裡面每個元素的id給取出來放入新的list(ids)。

List<AgentRechargeOrder> listData = agentRechargeOrderServiceImpl.getListByXXXX(XXXX);
 List<Integer> ids = listData.stream().map(AgentRechargeOrder::getId).collect(Collectors.toList());      

如果不想清除出單獨的id的list,直接傳整個List也是可以的, 這樣mapper層傳值就改成對應的包含對象的List即可。

Mapper層: 

int deleteMany(List<Integer> ids);      

對應的mapper.xml:

<delete id="deleteMany">
        delete  from agent_recharge_order where id in
        <foreach collection="list" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>      
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large      

繼續閱讀