Cập nhật hàng loạt bằng MyBatis với tham số List

Để 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.

Thẻ: mybatis mysql batch-update

Đăng vào ngày 16 tháng 05 lúc 22:54