mybatis动态表情
时间: 2025-05-09 19:23:58 浏览: 18
### MyBatis 动态 SQL 使用教程
#### 一、概述
MyBatis 的动态 SQL 不仅仅是简单的字符串拼接,而是利用 XML 标签在编译期解析 SQL 结构,在运行时根据条件动态调整 SQL 行为的一种机制[^2]。
#### 二、常用标签介绍
##### `<if>` 标签
`<if>` 是最常用的条件判断标签。当指定的测试属性(test attribute)表达式求值为 true 时,则该部分 SQL 将被包含到最终执行的 SQL 中;反之则忽略此片段[^1]。
```xml
<select id="findActiveBlogWithTitleLike" parameterType="map" resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
```
##### `<choose>`, `<when>`, 和 `<otherwise>` 组合
这些标签提供了类似于 Java switch-case 或者 if-else-if 的逻辑分支功能。只有第一个满足条件的 `when` 子句会被处理,如果没有匹配项,默认会触发 `otherwise` 部分(如果存在的话)。这有助于构建更复杂的查询条件组合[^3]。
```xml
<select id="findUsersByCondition" parameterType="User" resultType="User">
SELECT * FROM users
WHERE 1=1
<choose>
<when test="username != null and username != ''">
AND username=#{username}
</when>
<when test="sex != null and sex != ''">
AND sex=#{sex}
</when>
<otherwise>
-- 默认情况下不做任何过滤
</otherwise>
</choose>
</select>
```
##### `<where>` 及 `<set>`
这两个标签用于简化 SQL 片段中的 where 条件和 update 设置列表管理。它们能够自动处理前缀 "WHERE" 或 "SET", 并且可以安全地移除多余的逗号或 AND/OR 关键字。
###### 示例 - 使用 `<where>`:
```xml
<select id="getUserByIdOrName" parameterType="User" resultType="User">
SELECT * FROM users
<where>
<if test="id != null">AND id=#{id}</if>
<if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if>
</where>
</select>
```
###### 示例 - 使用 `<set>`:
```xml
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="email != null"> email=#{email} ,</if>
<if test="password != null"> password=#{password} ,</if>
</set>
WHERE id=#{id}
</update>
```
##### `<foreach>` 循环遍历集合
对于批量插入或多条记录更新场景非常有用。可以通过 collection 属性指明要迭代的数据源,并通过 item 定义每次循环产生的变量名。open/close 分别定义了包围整个序列的起始字符与结束字符,separator 则用来分割各个元素之间的间隔符[^4]。
```xml
<!-- 批量删除 -->
<delete id="batchDeletePosts" parameterType="list">
DELETE FROM posts WHERE post_id IN
<foreach item="postId" index="index" collection="list"
open="(" separator="," close=")">
#{postId}
</foreach>
</delete>
<!-- 插入多行数据 -->
<insert id="batchInsertComments" parameterType="java.util.List">
INSERT INTO comments (comment_text, created_at)
VALUES
<foreach collection="comments" item="item" separator=",">
(#{item.text}, NOW())
</foreach>
</insert>
```
#### 总结
上述内容展示了如何运用 MyBatis 提供的各种动态 SQL 构建工具来创建灵活高效的数据库交互代码。通过合理搭配不同类型的控制流标签以及内置辅助函数,开发者可以在不牺牲性能的前提下显著提高开发效率并增强应用程序维护性。
阅读全文
相关推荐












