Dynamic SQL hay SQL động là một đặc tính vô cùng mạnh mẽ của MyBatis. Nó cho phép các lập trình viên xây dựng nên các câu truy vấn năng động. Ví dụ, nếu bạn muốn tìm kiếm student trong database dự vào tên, địa chỉ của student.
MyBatis là một ngôn ngữ Dynamic SQL mạnh mẽ với các câu lệnh SQL được viết trong file Mapper. Sau đây là các biểu thức SQL động dựa trên OGNL do MyBatis cung cấp.
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
Nội dung chính
Câu lệnh điều kiện if
Điều phổ biến nhất để làm trong SQL động là điều kiện bao gồm một phần của mệnh đề where. Ví dụ:
<select id = "getStudentByName" parameterType = "Student" resultType = "Student"> SELECT * FROM STUDENT <if test = "name != null"> WHERE name LIKE #{name} </if> </select>
Trong ví dụ trên, nếu bạn truyền vào giá trị name khác null của student thì tất cả các record của student được trả về. Còn khi bạn truyền name khác null thì các record được trả về theo điều kiện LIKE.
Bạn cũng có thể khai báo nhiều câu lệnh if, ví dụ:
<select id = "getStudentByName_Id" parameterType = "Student" resultType = "Student"> SELECT * FROM STUDENT <if test = "name != null"> WHERE name LIKE #{name} </if> <if test = "id != 0"> AND id LIKE #{id} </if> </select>
Các lệnh choose, when và otherwise
MyBatis cung cấp một phần tử (thẻ) choose, tương tự như câu lệnh switch của Java. Nó giúp lựa chọn chỉ một trường hợp trong nhiều lựa chọn.
Ví dụ sau sẽ chỉ tìm kiếm theo name nếu nó được cung cấp, và nếu name không được cung cấp, thì chỉ tìm kiếm bằng id.
<select id = "getStudentByName_Id_phone" parameterType = "Student" resultType = "Student"> SELECT * FROM Student WHERE id != 0 <choose> <when test = "name != null"> AND name LIKE #{name} </when> <when test = "phone != 0"> AND phone LIKE #{phone} </when> </choose> </select>
Câu lệnh where
Hãy xem lại các ví dụ trước, chuyện gì sẽ xảy ra nếu không có điều kiện nào được đáp ứng? Khi đó câu lệnh SQL sẽ trông như sau:
SELECT * FROM Student WHERE
Đó là một câu lệnh lỗi, nhưng MyBatis có cung cấp lệnh where để giải quyết vấn đề đó một cách đơn giản và gọn gàng. Ví dụ:
<select id = "getStudentByName_Id_phone" parameterType = "Student" resultType = "Student"> SELECT * FROM STUDENT <where> <if test = "id != 0"> id = #{id} </if> <if test = "name != null"> AND name LIKE #{name} </if> </where> </select>
Lệnh WHERE chỉ được chèn vào SQL, khi có một trong các điều được đáp ứng. Nếu sau WHERE là AND hoặc OR thì AND và OR bị xóa đi.
Câu lệnh foreach
Phần tử foreach cho phép bạn chỉ định một collection và khai báo các biến item và index có thể được sử dụng bên trong phần tử.
Nó cũng cho phép bạn chỉ định các chuỗi mở và đóng, và thêm một dấu phân cách để đặt giữa các lần lặp. Bạn có thể xây dựng một điều kiện IN như sau:
<select id = "selectPostIn" resultType = "domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item = "item" index = "index" collection = "list" open = "(" separator = "," close = ")"> #{item} </foreach> </select>