大家都知道批量操作可以提升接口性能。不啰嗦,直接上代码。
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版本不同,有些方法不可用。