动态SQL是MyBatis最强大的特性之一,它允许你根据条件动态拼接SQL语句,解决传统JDBC中大量拼接字符串的繁琐问题。
动态SQL是一种根据运行时条件动态生成和执行SQL语句的技术。与静态SQL(在代码中固定写死的SQL)不同,动态SQL允许程序根据不同输入或条件动态灵活构建SQL,适用于需要灵活查询、参数化条件或复杂业务逻辑的场景。
作用:根据表达式的值(true/false)决定是否包含标签内的内容。
示例:根据传入参数动态更新字段。
UPDATE user
SET
name = #{name},
age = #{age},
email = #{email}
WHERE id = #{id}
风险点:如果最后一个
错误SQL:
UPDATE user SET name = 'John', WHERE id = 1; -- 逗号多余
作用:专用于处理UPDATE语句,自动去除SET子句末尾多余的逗号。
修正后的安全写法:
UPDATE user
name = #{name},
age = #{age},
email = #{email},
WHERE id = #{id}
MyBatis会智能生成:
-- 当只有 name 和 age 有值时
UPDATE user SET name = 'John', age = 25 WHERE id = 1;
作用:更灵活地处理前后缀,可替代
示例:用
name = #{name},
age = #{age},
等同于
作用:自动去除WHERE后的首个AND或OR,避免语法错误。
错误场景:
若所有条件都不满足,生成的SQL是:SELECT * FROM user WHERE (语法错误)。
修正后:
MyBatis会处理成:SELECT * FROM user WHERE name = 'John' 或直接去掉WHERE。
作用:常用于IN查询或批量插入。
示例:根据id列表查询用户:
INSERT INTO user (name, age) VALUES
(#{user.name}, #{user.age})
生成SQL:select * from user where id in(1,2,3)
DELETE FROM user WHERE id IN
#{id}
作用:实现多条件分支逻辑(类似switch-case)