mybatis动态sql核心是、、、、标签,可安全构建条件查询、多分支逻辑、集合操作及动态更新,避免sql注入与语法错误。

MyBatis 的动态 SQL 是处理复杂查询条件的核心能力,关键在于用好 <if></if>、<choose></choose>、<where></where>、<set></set>、<foreach></foreach> 等标签,避免手拼 SQL 带来的语法错误和 SQL 注入风险。
用 + 安全拼接 WHERE 条件
<where></where> 会自动处理开头的 AND 或 OR,只在内部有内容时才生成 WHERE 关键字,且智能去掉第一个多余的 AND。
例如查询用户,支持按姓名模糊匹配、状态筛选、创建时间范围:
<select id="selectUsers" resulttype="User">
SELECT * FROM user
<where><if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if><if test="status != null">
AND status = #{status}
</if><if test="startTime != null">
AND create_time >= #{startTime}
</if><if test="endTime != null">
AND create_time
</if></where>
ORDER BY create_time DESC
</select>
用 实现类似 switch 的多分支逻辑
当多个条件互斥(比如“按 ID 查”、“按手机号查”、“按用户名查”,只选其一),用 <choose></choose> 更清晰,避免多个 <if></if> 全部生效。
示例:
<select id="selectUserByCondition" resulttype="User">
SELECT * FROM user
<where><choose><when test="id != null">
id = #{id}
</when><when test="phone != null and phone != ''">
phone = #{phone}
</when><when test="username != null and username != ''">
username = #{username}
</when><otherwise>
1 = 0 <!-- 防止无条件时查全表 -->
</otherwise></choose></where></select>
用 处理 IN、批量插入等集合操作
<foreach></foreach> 是处理 IN 查询、批量 INSERT、UPDATE ... CASE 的必备标签,注意指定 collection、item、open、close 和 separator。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
IN 查询示例(参数为 List
<select id="selectUsersByIds" resulttype="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach></select>
批量插入(MySQL):
<insert id="batchInsertUsers">
INSERT INTO user (name, age, email) VALUES
<foreach collection="users" item="u" separator=",">
(#{u.name}, #{u.age}, #{u.email})
</foreach></insert>
用 安全生成 UPDATE 的 SET 子句
<set></set> 会自动剔除末尾多余的逗号,并只在有内容时添加 SET 关键字,防止空更新或语法错误。
示例(根据非空字段动态更新):
<update id="updateUserSelective">
UPDATE user
<set><if test="name != null and name != ''">name = #{name},</if><if test="age != null">age = #{age},</if><if test="email != null and email != ''">email = #{email},</if>
update_time = NOW()
</set>
WHERE id = #{id}
</update>
不复杂但容易忽略:所有 test 表达式里用的是 OGNL 语法,对象属性直接写 name,集合用 list.size > 0,字符串判空推荐 str != null and str != '';参数是单个基本类型或 String 时,在 XML 中统一用 _parameter 引用(如 test="_parameter != null"),但更推荐封装成对象传参,语义更清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










