Doze, MyBatis para processamento em lote

Nesta seção, aprenda a usar coleções para salvar dados em lote e, em seguida, use sql em lote (use foreach para atravessar) para dados em lote de uma só vez

Um, adicionar em lote

  1. configuração xml
<!--    INSERT INTO table-->
<!--    VALUES ("a1","a2","a3"),("b1","b2","b3"),(...)-->
<!--批量新增-->
<!--因为批处理是一次性导入多条,所以这里使用list-->
<!--foreach类似for循环 collection:迭代的数据源,固定写入list,表示从外界传入的list集合 ,item;循环中的迭代变量
,item:索引,类似于数字,seperator:分割符号-->
<insert id="batchInsert" parameterType="java.util.List">
    insert into t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.title},#{item.subTitle},#{item.originalCost},#{item.currentPrice},#{item.discount},#{item.isFreeDelivery},#{item.categoryId})
    </foreach>
</insert>
  1. teste
@Test
public void testBatchInsert() {
    
    
    SqlSession sqlSession = null;
    try {
    
    
        sqlSession = MyBatisUtils.openSession();
        List<Goods> good = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
    
    
            Goods goods = new Goods();
            goods.setTitle("测试商品6");
            goods.setSubTitle("测试商品666");
            goods.setCategoryId(111);
            goods.setOriginalCost(1000f);
            goods.setIsFreeDelivery(1);
            goods.setDiscount(2f);
            goods.setCurrentPrice(300f);
            good.add(goods);
        }
        sqlSession.insert("goods.batchInsert",good);
        sqlSession.commit();
    } catch (Exception e) {
    
    
        if (sqlSession != null) {
    
    
            sqlSession.rollback();
        }
        throw e;
    } finally {
    
    
       MyBatisUtils.closeSqlSession(sqlSession);
    }
}

Dois, exclusão em lote

  1. configuração xml
<!-- DELETE FROM table where goods_id in(a,b)-->
<!--批量删除-->
<!--这里只需要传入item即可,因为它只是goods编号-->
<!--open和close指代删除语句in后面的左右括号-->
<delete id="batchDelete" parameterType="java.util.List">
    delete from t_goods where goods_id in
    <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
        (#{item})
    </foreach>
</delete>
  1. teste
@Test
public void testBatchDelete() {
    
    
    SqlSession sqlSession = null;
    try {
    
    
        sqlSession = MyBatisUtils.openSession();
        List<Integer> good = new ArrayList<>();
        good.add(10000);
        good.add(10001);
        sqlSession.delete("goods.batchDelete",good);
        sqlSession.commit();
    } catch (Exception e) {
    
    
        if (sqlSession != null) {
    
    
            sqlSession.rollback();
        }
        throw e;
    } finally {
    
    
        MyBatisUtils.closeSqlSession(sqlSession);
    }
}

Três, as limitações da inserção de dados em lote

  1. Incapaz de obter o id dos dados inseridos, seria impróprio se você deseja fazer o processamento subsequente por meio do id
  2. O sql gerado em lote é muito longo e pode ser rejeitado pelo servidor (solução: você pode usar a forma segmentada, por exemplo, para importar 100w peças de dados, você pode completar o segundo aninhamento através do loop for e importar 1w peças em um tempo)

Acho que você gosta

Origin blog.csdn.net/qq_36792120/article/details/112500855
Recomendado
Clasificación