目录
- 单次执行
- 单次新增
- 单次更新
- 单次删除
- 批量执行
- 批量新增
- 批量更新
- for 循环执行更新
- for 循环生成多条 sql,一次执行
- 批量删除
- 参数传递
- 预处理方式 (`OGNL表达式 #{}`)
- 数据类型转换
- 直接替换 `(EL表达式 ${})`
- 安全
单次执行
单次新增
<insert id="insert" parameterType="java.util.List">
INSERT INTO USERS
(
NAME,
EMAIL,
AGE
)
VALUES
(
#{item.name},
#{item.email},
#{item.age}
)
</insert>
单次更新
<update id="update" parameterType="java.util.List">
UPDATE USER
<set>
NAME = #{item.name},
EMAIL = #{item.email},
AGE = #{item.age}
</set>
where ID = ${item.id}
</update>
单次删除
<delete id="delete" parameterType="java.util.List">
DELETE FROM
USERS
WHERE
ID = #{id}
</delete>
批量执行
MyBatis 的设计初衷是每个标签对应一个 SQL 语句,也就是不支持单个标签多条 SQL 语句的执行。
批量新增
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO USERS
(
NAME,
EMAIL,
AGE
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.name},
#{item.email},
#{item.age}
)
</foreach>
</insert>
批量更新
for 循环执行更新
for 循环生成多条 sql,一次执行
如需要在连接 MySQL
的 URL
上加 &allowMultiQueries=true
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";">
UPDATE USER
<set>
NAME = #{item.name},
EMAIL = #{item.email},
AGE = #{item.age}
</set>
where ID = ${item.id}
</foreach>
</update>
批量删除
<delete id="deleteBatch" parameterType="java.util.List">
DELETE FROM USERS
WHERE ID IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
参数传递
- XML 中逻辑判断 (
<if> 等标签
),不同的 Java 类型不同的判断规则 - 入参类型应提前处理为与数据库中相匹配的类型,SQL 中处理类型问题不仅麻烦且可能存在版本问题
预处理方式 (OGNL表达式 #{}
)
- 支持防 SQL 注入
- 传入的参数自动数据类型转换
- 有预处理,不能用于传递表名、列名 等
数据类型转换
Java 类型 | XML 代码示例 |
---|---|
Char | <if test="req.parameter != null and req.parameter == 'A'"> |
Int | <if test="req.parameter != null and req.parameter == 18"> |
Boolean | <if test="req.parameter != null and req.parameter'"> |
String | <if test="req.parameter != null and req.parameter != ''"> |
List | <if test="req.parameter != null and req.parameter.size() > 0"> |
Array | <if test="req.parameter != null and req.parameter.length > 0"> |
Map | <if test="req.parameter != null and !req.parameter.isEmpty()"> |
Date | <if test="req.parameter != null"> |
LocalDateTime | <if test="req.parameter != null"> |
直接替换 (EL表达式 ${})
- 有 SQL 注入风险
- 传入的参数不支持自动数据类型转换
- 可用于动态构建 SQL,用于传递表名、列名、排序字段名 等