mybatis动态效果设置
时间: 2025-01-06 07:37:33 浏览: 45
### MyBatis 中实现动态 SQL 效果
#### 使用 `if` 标签进行条件判断
为了基于输入参数来控制 SQL 语句的生成,可以利用 `<if>` 标签。此标签允许根据特定条件包含或排除某些部分的 SQL 代码片段。例如,在更新记录时仅当提供了新的用户名才设置该字段:
```xml
<update id="updateEmp" parameterType="com.example.Emp">
UPDATE employees SET
<set>
<if test="username != null and username != '' ">
username = #{username},
</if>
</set>
WHERE id = #{id}
</update>
```
上述 XML 片段展示了如何通过检查传入对象中的 `username` 属性是否存在以及不为空字符串的情况下才会尝试去更改数据库表内的对应列[^1]。
#### 利用 `foreach` 实现批量操作
对于需要处理多条记录的情况,比如在一个列表中指定多个 ID 来查找相应实体,则可借助 `<foreach>` 元素完成这一功能。下面是一个用于查询具有给定 IDs 的员工信息的例子:
```xml
<select id="getEmployeesByIds" resultType="com.example.Emp">
SELECT * FROM employees WHERE id IN
<foreach item="id" index="index" collection="list"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
```
这里定义了一个名为 `getEmployeesByIds` 的查询映射,其中包含了用来遍历 Java List 或数组类型的集合并将其转换成适合 SQL 查询的形式的部分[^3]。
#### 组合多种标签达到更复杂的逻辑表达
除了单独使用的这些基本组件外,还可以组合它们以满足更加复杂的需求场景。例如,如果希望在一次请求里既能做单个字段的有条件更新又能支持批量删除动作的话,就可以这样设计 Mapper 文件里的配置项:
```xml
<delete id="batchDeleteOrSingleFieldUpdate" parameterType="java.util.Map">
<!-- 批量删除 -->
DELETE FROM employees
<where>
<choose>
<when test="ids != null and ids.size() > 0">
AND id IN
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</when>
<otherwise>
AND false -- 默认情况下不做任何事情
</otherwise>
</choose>
<!-- 单一字段更新 (互斥的操作)-->
<if test="emp != null && (emp.username != null or emp.email != null)">
;
UPDATE employees SET
<trim prefix="SET " suffixOverrides=",">
<if test="emp.username != null">username=#{emp.username},</if>
<if test="emp.email != null">email=#{emp.email}</if>
</trim>
WHERE id = #{emp.id};
</if>
</where>
</delete>
```
这段代码展示了一种混合模式下的操作方式——既能够接收一组待删记录ID也可以接受单一实例来进行局部属性刷新;值得注意的是两个不同性质的动作之间采用了分号隔开作为独立SQL命令提交。
阅读全文
相关推荐


















