<select id="searchUser" resultType="User">
SELECT * FROM user
<where>
<if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%')</if>
<if test="age != null"> AND age = #{age}</if>
</where>
</select>
❌ 不使用动态 SQL(需要写多个方法):
<select id="findByName" ...>SELECT * FROM user WHERE name = #{name}</select>
<select id="findByAge" ...>SELECT * FROM user WHERE age = #{age}</select>
<select id="findByNameAndAge" ...>SELECT * FROM user WHERE name = #{name} AND age = #{age}</select>
🧩 MyBatis 动态 SQL 标签速查表
标签
作用
示例
注意事项
<if>
条件判断
<if test="name != null">AND name = #{name}</if>
test 支持 OGNL 表达式,如 != null && name != ''
<choose><when><otherwise>
分支选择(类似 switch-case)
见下方示例
只能命中一个 <when>,类似 if…else
<trim>
自定义前缀、后缀、去掉多余的分隔符
`<trim prefix=“WHERE” prefixOverrides="AND
OR "> … `
<where>
自动加 WHERE 并去掉首个 AND/OR
<where><if test="...">AND ...</if></where>
自动处理空条件时避免语法错误
<set>
自动加 SET 并去掉多余逗号(用于 UPDATE)
<set><if test="...">name=#{name},</if></set>
适用于动态更新字段
<foreach>
遍历集合,构造 IN 语句、批量插入等
见下方示例
支持 list、array、Map,常用于 IN (...)
<bind>
创建一个变量,可用于字符串拼接等
<bind name="pattern" value="'%' + name + '%'" />
常配合模糊查询使用
📚 示例合集
1️⃣ <if> 使用示例
<selectid="selectUser"resultType="User">
SELECT * FROM user
<where><iftest="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if><iftest="age != null">
AND age = #{age}
</if></where></select>
2️⃣ <choose> / <when> / <otherwise> 示例
<selectid="selectUser"resultType="User">
SELECT * FROM user
<where><choose><whentest="name != null">
AND name = #{name}
</when><whentest="age != null">
AND age = #{age}
</when><otherwise>
AND status = 'active'
</otherwise></choose></where></select>
3️⃣ <trim> 示例(手动 WHERE 拼接)
<selectid="selectUser"resultType="User">
SELECT * FROM user
<trimprefix="WHERE"prefixOverrides="AND |OR "><iftest="name != null">AND name = #{name}</if><iftest="age != null">AND age = #{age}</if></trim></select>
4️⃣ <set> 示例(动态更新)
<updateid="updateUser">
UPDATE user
<set><iftest="name != null">name = #{name},</if><iftest="age != null">age = #{age},</if></set>
WHERE id = #{id}
</update>
5️⃣ <foreach> 示例(IN 查询)
<selectid="selectByIds"resultType="User">
SELECT * FROM user WHERE id IN
<foreachcollection="idList"item="id"open="("separator=","close=")">
#{id}
</foreach></select>
语法片段
含义
id="selectByIds"
这是 Mapper 接口中方法对应的 SQL ID
resultType="User"
查询结果会映射成 User 类
collection="idList"
传入的是一个集合参数名,比如一个 List<Integer> 类型的参数
item="id"
遍历集合中的每个元素,当前元素命名为 id
open="("
拼接 SQL 时,开头加一个左括号 (
separator=","
每个参数之间用逗号隔开
close=")"
最后一个参数后加上右括号 )
#{id}
当前遍历元素的值,作为 SQL 参数传入(防 SQL 注入)
6️⃣ <bind> 示例(模糊搜索)
<selectid="searchByName"resultType="User"><bindname="pattern"value="'%' + name + '%'"/>
SELECT * FROM user WHERE name LIKE #{pattern}
</select>