2014-04-04 17 views
5

Trong tệp bản đồ Mybatis xml, tôi đã cố gắng viết truy vấn cập nhật cho bảng Người dùng như được hiển thị bên dưới. Mỗi tham số đầu vào có thể là null và tôi chỉ cập nhật khi nó không phải là null. Bạn không biết điều kiện 'if' nào có thể rơi vào và cái nào có thể là điều cuối cùng, do đó dấu phẩy phải được thêm vào trong mỗi câu lệnh.MyBatis thêm dấu phẩy trong truy vấn cập nhật

Vấn đề là thêm ',' gây ra ngoại lệ truy vấn. Có vẻ như Mybatis không bỏ qua dấu phẩy thừa.

Giải pháp thay thế của tôi là đặt "id = # {id}" vào cuối đã khắc phục sự cố nhưng không cần thiết.

Giải pháp thực sự là gì?

Mã:

<update id="update" parameterType="User"> 
    UPDATE user SET 

    <if test="username != null"> 
     username = #{username}, 
    </if> 
    <if test="password != null"> 
     password = #{password}, 
    </if> 
    <if test="email != null"> 
     email = #{email}, 
    </if> 
    id= #{id} // this is redundant 

    WHERE id = #{id} 
</update> 

PS: Môi trường Tôi đang sử dụng là: Java Spring + MyBatis + MySQL.

+0

Tôi không quen thuộc với 'mybatis' nên tha thứ cho những câu hỏi ngớ ngẩn, nhưng tại sao bạn cần một dấu phẩy sau' # {email} 'trong lần đầu tiên địa điểm? –

+0

@ shree.pat18, trong trường hợp email == null nhưng mật khẩu! = Null, câu lệnh cuối cùng trước WHERE là mật khẩu = # {password}, ​​có thêm dấu phẩy, vì vậy tôi phải thêm giải pháp thay thế "id = # {id} ", dẫn đến dấu phẩy sau # {email}. –

Trả lời

13

Nhờ các tệp mapper.xml của MyBatis Generator, tôi đã học cách loại bỏ dấu phẩy. MyBatis có thẻ <set> để xóa dấu phẩy cuối cùng. Nó cũng được viết bằng MyBatis - Dynamic Sql:

Ở đây, yếu tố thiết lập sẽ tự động thêm vào trước các từ khoá SET, và cũng loại bỏ bất kỳ dấu phẩy không liên quan mà có thể kéo theo việc giá trị bài tập sau khi các điều kiện được áp dụng.

Bạn có thể viết nó như:

<update id="update" parameterType="User"> 
    UPDATE user 
    <set> 
     <if test="username != null"> 
      username = #{username}, 
     </if> 
     <if test="password != null"> 
      password = #{password}, 
     </if> 
     <if test="email != null"> 
      email = #{email}, 
     </if> 
    </set> 
    WHERE id = #{id} 
</update> 
+0

Tuyệt vời, nó hoạt động! Cảm ơn @Yigitalp Ertem. Đã chấp nhận câu trả lời và +1. BTW, trong mã của bạn, SET được nhân bản và nó cần được loại bỏ. :) –

+0

Quên nó trong khi dán, nhờ đó, tôi đã chỉnh sửa câu trả lời. :) – yalpertem

Các vấn đề liên quan