MyBatis 怎么封装动态 SQL?
MyBatis 提供了多种动态 SQL 元素来帮助你创建动态 SQL 语句,包括 <if>
, <choose>
, <when>
, <otherwise>
, <foreach>
, <set>
等。
以下是一些使用例子:
<if>
:<if>
元素可以让你根据某个条件来决定是否要插入一部分 SQL 语句。
<select id="selectUser" resultType="com.example.User">
SELECT * FROM user
<where>
<if test="firstName != null">
AND first_name = #{firstName}
</if>
<if test="lastName != null">
AND last_name = #{lastName}
</if>
</where>
</select>
在上面的例子中,如果 firstName
和 lastName
都不为 null
,那么生成的 SQL 语句将会包含 AND first_name = #{firstName}
和 AND last_name = #{lastName}
。如果其中任何一个为 null
,那么对应的部分就不会被包含在 SQL 语句中。
<choose>
,<when>
,<otherwise>
: 这些元素可以让你根据多个条件来选择一部分 SQL 语句。
<select id="selectUser" resultType="com.example.User">
SELECT * FROM user
<where>
<choose>
<when test="firstName != null">
AND first_name = #{firstName}
</when>
<when test="lastName != null">
AND last_name = #{lastName}
</when>
<otherwise>
AND id = #{id}
</otherwise>
</choose>
</where>
</select>
在上面的例子中,如果 firstName
不为 null
,那么生成的 SQL 语句将会包含 AND first_name = #{firstName}
,否则,如果 lastName
不为 null
,那么生成的 SQL 语句将会包含 AND last_name = #{lastName}
,否则,生成的 SQL 语句将会包含 AND id = #{id}
。
<foreach>
:<foreach>
元素可以让你对一个集合进行迭代,并为每个元素生成一部分 SQL 语句。
<delete id="deleteUsers" parameterType="list">
DELETE FROM user WHERE id IN
<foreach item="id" collection="list" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
在上面的例子中,<foreach>
元素将会对 list
集合进行迭代,并为每个 id
生成一个 #{id}
,所有的 #{id}
将会被包含在 (
和 )
之间,并用 ,
来分隔。
<set>
:<set>
元素主要用于生成动态的update
语句,它能智能处理那些可能出现的逗号问题。
<update id="updateUser" parameterType="com.example.User">
UPDATE user
<set>
<if test="firstName != null">
first_name = #{firstName},
</if>
<if test="lastName != null">
last_name = #{lastName},
</if>
</set>
WHERE id = #{id}
</update>
在上面的例子中,如果 firstName
和 lastName
都不为 null
,那么生成的 SQL 语句将会是 UPDATE user SET first_name = #{firstName}, last_name = #{lastName} WHERE id = #{id}
,如果其中任何一个为 null
,那么对应的部分就不会被包含在 SQL 语句中,而且 <set>
元素能智能处理那些可能出现的逗号问题。
这些就是 MyBatis 提供的主要动态 SQL 元素,你可以根据你的需求混合使用它们来创建复杂的动态 SQL 语句。