MyBatis 动态 SQL
<set>
标签
需求:根据传入的用户对象属性
来更新用户数据,可以使用 <set>
标签来指定动态内容。
接口定义:根据传入的用户 id 属性,修改其他不为 null 的属性
单元测试:
运行对应测试类方法,观察打印日志:
确认表对应记录是否更新数据:
每次更新并不会每一个字段都是必须更新的,所以我们引入 <if>
标签设置动态更新字段
运行对应测试类方法,观察打印日志:
确认表对应记录是否更新数据:
虽然当前写的 MyBatis XML 已经满足我们的需求了,但是我们还是要介绍另一种更新方法;
也就是在更新语句中引入 <set>
标签;
运行对应测试类方法,观察打印日志:
确认表对应记录是否更新数据:
因为没有对 gender 属性传参,所以 gender 从 1 变成了 0,说明这条数据也是被更新了的;
<set>
:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)以上标签也可以使用
<trim prefix="set" suffixOverrides=",">
替换。
或者使用注解方式:
<include>
标签 & <sql>
标签
问题分析:
- 在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码
我们可以对重复的代码片段进行抽取
,将其通过 <sql>
标签封装到一个SQL片段,然后再通过 <include>
标签进行引用。
<sql>
:定义可重用的SQL片段
(这个片段不一定可执行)<include>
:通过属性 refid
,指定包含的SQL片段
<sql id="allColumn">
id,
username,
age,
gender,
phone,
delete_flag,
create_time,
update_time
</sql>
通过 <include>
标签在原来抽取的地方进行引用。操作如下:
<select id="queryAllUser" resultMap="BaseMap">
SELECT
<include refid="allColumn"/>
FROM userinfo
</select>
<select id="queryById" resultType="com.example.demo.model.UserInfo">
SELECT
<include refid="allColumn"/>
FROM userinfo
WHERE id = #{id}
</select>