mySQL数据库,mybatis实现大批量插入和更新的SQL语句(亲测有效)

大家都知道批量操作可以提升接口性能。不啰嗦,直接上代码。

1.批量插入

批量插入相信大家都很熟悉:

mapper接口:

/**
     * 批量插入订单明细
     * @param list
     * @return
     */
    boolean batchInsertOrderEntry(@Param("list") List<CgddOrderEntry> list);

mapper.xmlSQL文件:

 <insert id="batchInsertOrderEntry" parameterType="java.util.List">
        INSERT INTO srm_cgdd_order_entry (
        TEXT, PRICE
        ) VALUES
        <foreach collection="list" item="item" separator=",">
            (
            #{item.text}, #{item.price}
            )
        </foreach>
    </insert>

2.批量修改

2.1 方法一:foreach实现

mapper接口:

  /**
     * 批量更新订单明细
     * @param list
     * @return
     */
    boolean batchUpdateOrderEntry(@Param("list") List<CgddOrderEntry> list);
}

mapper.xmlSQL文件

<update id="batchUpdateOrderEntry" parameterType="java.util.List">
    <foreach collection="list" item="item" separator=";">
        UPDATE srm_cgdd_order_entry
        SET
            TEXT= #{item.text},
            PRICE= #{item.price}
        WHERE ID = #{item.id}
    </foreach>
</update>

2.2 方法二:case实现

mapper接口:

  /**
     * 批量更新订单明细
     * @param list
     * @return
     */
    boolean batchUpdateOrderEntry(@Param("list") List<CgddOrderEntry> list);
}

mapper.xmlSQL文件:

<update id="batchUpdateOrderEntry" parameterType="java.util.List">
    UPDATE srm_cgdd_order_entry
    <trim prefix="SET" suffixOverrides=",">
            TEXT = CASE
                <foreach collection="list" item="item" index="index">
                    WHEN ID = #{item.id} THEN #{item.text}
                </foreach>
            END,
            PRICE = CASE
                <foreach collection="list" item="item" index="index">
                    WHEN ID = #{item.id} THEN #{item.price}
                </foreach>
            END,
       </trim>
    WHERE ID IN
    <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
        #{item.id}
    </foreach>
</update>

2.3 方法三:直接用jdbcTemplate实现

此方法是在serviceImpl层实现的。

service接口:

  /**
     * 批量更新订单明细
     * @param list
     * @return
     */
    boolean batchUpdateOrderEntry2(List<CgddOrderEntry> list);

serviceImpl实现:



      @Autowired
    private JdbcTemplate jdbcTemplate;


    @Override
    public boolean batchUpdateOrderEntry2(List<CgddOrderEntry> list){
       String sql = "UPDATE srm_cgdd_order_entry SET "
                + "TEXT = ?, PRICE = ?" +
                  "WHERE ID = ?";

        List<Object[]> argsList = list.stream().map(entry -> new Object[] {
            entry.getText(), entry.getPrice(), 
            entry.getId()
        }).collect(Collectors.toList());

        int[] updateCounts = jdbcTemplate.batchUpdate(sql, argsList);
        return Arrays.stream(updateCounts).allMatch(count -> count == 1);
    }

注意:上述三种方法中,可能会因为mysql版本不同,有些方法不可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值