# 常见SQL SELECT * FROM goods where id in (1,2,3) SELECT * FROM goods where id in <foreach item="item" index="index" collection="ids.split(',')" open="(" separator="," close=")"> #{item} </foreach>
动态SQL
选择语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#choose、when、otherwise 类型其他语言中 switch <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
1 2 3 4 5 6 7 8
<choose> <when test="status == 0"> AND status = 0 </when> <otherwise> AND status >= #{status} </otherwise> </choose>
1 2 3 4 5 6 7 8 9 10
<if test="status != null and status != ''"> <choose> <when test="status == 0"> AND status = 0 </when> <otherwise> AND status >= #{status} </otherwise> </choose> </if>
> #gt,gte,lt,lte缩写的含义 > ## 这几个单词在范围查询的时候会用到 > gt: greater than 大于 > gte: greater than or equal 大于等于 > lt: less than 小于 > lte: less than or equal 小于等于 >
1 2 3 4 5 6 7 8 9 10 11 12 13
<!-- 范围查询, 注意这里大于小于符号 --> <where> <iftest="username != null and username != ''"> AND username like concat('%', #{username}, '%') </if> <iftest="beginTime != null and beginTime != ''"> and create_time >= #{beginTime} </if> <iftest="endTime != null and endTime != ''"> and create_time <= #{endTime} </if> AND del_flag = 0 </where>
作用:根据条件决定是否包含某段 SQL。 说明: test 属性是 OGNL 表达式,返回 true 时才会包含 SQL 片段。 通常结合 <where> 使用,避免 WHERE 1=1 这样的写法。
<selectid="findUser"resultType="User"> SELECT * FROM user WHERE 1=1 <iftest="name != null"> AND name = #{name} </if> <iftest="age != null"> AND age = #{age} </if> </select>
多条件分支choose
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<choose>、<when>、<otherwise>(类似 Java 的 switch-case) 作用:多条件分支选择,类似 if-else if-else。 说明: 只执行第一个匹配的 <when>,如果没有匹配则执行 <otherwise>。 <selectid="findUser"resultType="User"> SELECT * FROM user WHERE <choose> <whentest="name != null"> name = #{name} </when> <whentest="age != null"> age = #{age} </when> <otherwise> 1=1 </otherwise> </choose> </select>
智能where
1 2 3 4 5 6 7 8 9 10 11 12
作用:自动处理 WHERE 条件,避免 WHERE AND 语法错误。 说明: 如果 <where> 内的内容为空,则不会生成 WHERE。 如果内容非空,会自动去掉开头的 AND 或 OR。 <selectid="findUser"resultType="User"> SELECT * FROM user <where> <iftest="name != null"> AND name = #{name} </if> <iftest="age != null"> AND age = #{age} </if> </where> </select>
智能update
1 2 3 4 5 6 7 8 9 10 11 12
作用:动态生成 UPDATE 语句,自动去掉末尾的 ,。 说明: 自动去除最后的 ,,避免 UPDATE user SET name=?, age=?, WHERE id=? 这样的语法错误。
<updateid="updateUser"> UPDATE user <set> <iftest="name != null"> name = #{name}, </if> <iftest="age != null"> age = #{age}, </if> </set> WHERE id = #{id} </update>
<!-- IN 查询 --> <selectid="findUsersByIds"resultType="User"> SELECT * FROM user WHERE id IN <foreachcollection="ids"item="id"open="("separator=","close=")"> #{id} </foreach> </select>
<!-- 批量插入 --> <insertid="batchInsert"> INSERT INTO user (name, age) VALUES <foreachcollection="users"item="user"separator=","> (#{user.name}, #{user.age}) </foreach> </insert>
绑定变量bind
1 2 3 4 5 6 7 8 9
作用:创建变量,用于 SQL 拼接或复杂表达式计算。 说明: 适用于模糊查询、字符串拼接等场景。
<selectid="findUserByName"resultType="User"> <bindname="pattern"value="'%' + name + '%'" /> SELECT * FROM user WHERE name LIKE #{pattern} </select>