List<ProductSkuVO> productSkuList = new ArrayList<ProductSkuVO>(); //商品sku对象 ProductSkuVO productSkuVO = null; for (int i = 0; i < jsonArray.size(); i++) { json = jsonArray.getJSONObject(i); //商品的sku编号 skuId = json.getString("sku_id"); //商品的购买数量 stockNumStr = json.getString("stock_num"); if(StrUtil.isNotNull(stockNumStr)){ stockNum = new BigDecimal(stockNumStr); } productSkuVO = new ProductSkuVO(); productSkuVO.setSKU_ID(skuId); productSkuVO.setSTOCK_NUM(stockNum); productSkuList.add(productSkuVO); } Map<String,Object> parameter = new HashMap<String, Object>(); parameter.put("parameters", productSkuList); //循环update,回归库存 int count=productSkuService.modifyProductSkuById(parameter); if(count == jsonArray.size()){ jsonResult.put("code", -1); //批量执行成功 }else{ jsonResult.put("code", 1); //批量执行失败 }
public int modifyProductSkuById(Map<String,Object> map){ int i=this.baseDao.update("updateSkuById", map, ProductSkuVO.class); return i; }
<!-- 下单后1个小时 库存回归 --> <update id="updateSkuById" parameterType="map"> UPDATE BIZ_PRODUCT_SKU SET STOCK_NUM = CASE <foreach collection="parameters" item="item"> WHEN SKU_ID = #{item.SKU_ID} THEN STOCK_NUM + #{item.STOCK_NUM} </foreach> END WHERE SKU_ID IN <foreach collection="parameters" item="item" open="(" separator="," close=")"> #{item.SKU_ID} </foreach> </update>
我这边是将list集合放到了map里面,然后通过键值对的方式用parameters 来批量修改,但我总觉得这段代码写的有问题,看看sql,能不能直接传一个list过去呢?好吧,我来试试..
7月22日:今天在测试这个功能的时候发现一个问题,当where条件相同的时候只能成功update一个。上面的代码中 假如有多个skuid是相同的那么它只能成功修改一个。我问了一个朋友,他说一条sql满足批量更新的操作,所以我更改了sql语句,如下;
<!-- 下单后1个小时 库存回归 --> <update id="updateSkuById" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> UPDATE BIZ_PRODUCT_SKU <set> STOCK_NUM=STOCK_NUM+#{item.STOCK_NUM} </set> where SKU_ID = #{item.SKU_ID} </foreach> </update>