MyBatis 动态 SQL 语法
1. <where> 标签
自动处理
WHERE关键字,避免开头出现多余的AND或OR。如果内部条件全部为空,则不会生成
WHERE。
SELECT * FROM sf_user
<where><if test="user_name != null">user_name LIKE CONCAT('%', #{user_name}, '%')</if><if test="user_state != null">AND user_state = #{user_state}</if>
</where>2. <trim> 标签
可以自定义前缀和去除多余的关键字。
prefix:添加前缀prefixOverrides:去除开头指定的字符串(如AND、OR)
SELECT * FROM sf_user
<trim prefix="WHERE" prefixOverrides="AND"><if test="user_name != null">AND user_name LIKE CONCAT('%', #{user_name}, '%')</if><if test="user_state != null">AND user_state = #{user_state}</if>
</trim>3. <set> 标签(用于 UPDATE)
自动处理
SET子句,去除末尾多余的逗号。
<update id="updateAuthorIfNecessary">UPDATE Author<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="email != null">email = #{email},</if><if test="bio != null">bio = #{bio}</if></set>WHERE id = #{id}
</update>4. <foreach> 标签(遍历集合)
常用于
IN查询。collection:集合参数名item:遍历时的元素变量名open/close:开始和结束符号separator:元素分隔符
<select id="selectPostIn" resultType="domain.blog.Post">SELECT * FROM POST PWHERE ID IN<foreach item="val" collection="list" open="(" separator="," close=")">#{val}</foreach>
</select>5. <sql> 与 <include> 标签
<sql>:定义可重用的 SQL 片段<include>:引用已定义的 SQL 片段
<sql id="query_user_where"><!-- 条件片段 -->
</sql>SELECT * FROM sf_user
<trim prefix="WHERE" prefixOverrides="AND"><include refid="query_user_where"/>
</trim>⚠️ 注意点
使用
#{}进行参数占位,避免 SQL 注入。在
<if>中判断字段是否为null或空字符串。<where>和<set>会自动处理语法冗余,推荐使用。
