1.最简单的方式
通过多次执行update tablename set () values();
适用于并发少,不会对数据库造成较大压力的情况下使用;
2.使用foreach
mapper栗子如下:
<update id="updatePayNoticketsBatch" parameterType="java.util.List">
<foreach collection="payNoticketModels" item="payNoticketModel" index="index" separator=";">
UPDATE
pay_no_ticket
SET
risk_type=#{payNoticketModel.riskType},
pin_money_status=#{payNoticketModel.pinMoneyStatus},
pin_money_ratio=#{payNoticketModel.pinMoneyRatio},
single_ticket_pin_money=#{payNoticketModel.singleTicketPinMoney},
pin_money_total_sum=#{payNoticketModel.pinMoneyTotalSum}
WHERE
id=#{payNoticketModel.id}
</foreach>
</update>
优点:减少代码量;
缺点:并没有减少db的访问次数,每次update实际上都同数据库建立了一次链接
3.使用set...when,栗子如下:
UPDATE mytable
SET myfield = CASE id
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
优点,减少代码量,减少了db的压力
缺点,不适合大批量的情况,不方便进行字符串拼接;
适用于小批量的情况;
4.使用ON DUPLICATE KEY UPDATE
<insert id="updatePayNoticketsBatch" parameterType="java.util.List">
INSERT INTO pay_no_ticket
(id,order_no,risk_type,pin_money_status,pin_money_ratio,single_ticket_pin_money,pin_money_total_sum,flight_segment_type)
VALUES
<foreach collection="payNoticketModels" item="payNoticketModel" index="index" separator=",">
(#{payNoticketModel.id},
#{payNoticketModel.orderNo},
#{payNoticketModel.riskType},
#{payNoticketModel.pinMoneyStatus},
#{payNoticketModel.pinMoneyRatio},
#{payNoticketModel.singleTicketPinMoney},
#{payNoticketModel.pinMoneyTotalSum},
#{payNoticketModel.flightSegmentType})
</foreach>
ON DUPLICATE KEY UPDATE
risk_type=VALUES (risk_type),
pin_money_status=VALUES (pin_money_status),
pin_money_ratio=VALUES(pin_money_ratio),
single_ticket_pin_money = VALUES(single_ticket_pin_money),
pin_money_total_sum=VALUES (pin_money_total_sum)
</insert>