Để thực hiện nhiều câu lệnh cập nhật trong một lần gọi, bạn cần thêm tham số
allowMultiQueries=true vào chuỗi kết nối JDBC. Ví dụ:
jdbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=utf-8
Cách tiếp cận đầu tiên là sử dụng vòng lặp để tạo ra nhiều câu truy vấn SQL khác nhau dựa trên danh sách các đối tượng được truyền vào.
Phương pháp 1: Sử dụng vòng lặp foreach
Bằng cách sử dụng thẻ <foreach>, chúng ta có thể xây dựng từng câu lệnh UPDATE cho mỗi phần tử trong danh sách:
<update id="capNhatLoat" parameterType="java.util.Map">
<foreach collection="danhSach" separator=";" item="khachHang">
UPDATE khach_hang SET
ten = #{khachHang.ten},
tuoi = #{khachHang.tuoi},
gioiTinh = #{khachHang.gioiTinh},
soChungMinhThu = #{khachHang.soChungMinhThu},
loaiChungMinhThu = #{khachHang.loaiChungMinhThu}
WHERE maKhachHang = #{khachHang.maKhachHang}
</foreach>
</update>
Phương pháp 2: Sử dụng cấu trúc CASE WHEN
Phương pháp này tận dụng cú pháp CASE WHEN của MySQL để tối ưu hóa việc cập nhật hàng loạt mà không cần chạy nhiều câu lệnh UPDATE riêng biệt.
<update id="capNhatLoatCaseWhen" parameterType="java.util.Map">
UPDATE khach_hang
<trim prefix="SET" suffixOverrides=", ">
<trim prefix="ten = CASE" suffix="END,">
<foreach collection="danhSach" item="khachHang">
<if test="khachHang.ten != null">
WHEN maKhachHang = #{khachHang.maKhachHang} THEN #{khachHang.ten}
</if>
</foreach>
</trim>
<trim prefix="tuoi = CASE" suffix="END,">
<foreach collection="danhSach" item="khachHang">
<if test="khachHang.tuoi != null">
WHEN maKhachHang = #{khachHang.maKhachHang} THEN #{khachHang.tuoi}
</if>
</foreach>
</trim>
<trim prefix="gioiTinh = CASE" suffix="END,">
<foreach collection="danhSach" item="khachHang">
<if test="khachHang.gioiTinh != null">
WHEN maKhachHang = #{khachHang.maKhachHang} THEN #{khachHang.gioiTinh}
</if>
</foreach>
</trim>
</trim>
<where>
<foreach collection="danhSach" separator="OR" item="khachHang">
maKhachHang = #{khachHang.maKhachHang}
</foreach>
</where>
</update>
Với phương pháp này, chỉ một câu lệnh SQL duy nhất sẽ được thực thi, giúp cải thiện hiệu suất khi làm việc với số lượng lớn dữ liệu.