目录
在现代 Web 应用开发中,数据库操作是至关重要的一环。MyBatis 作为一款优秀的持久层框架,为开发者提供了灵活且强大的数据库交互方式。其中,多态 SQL 是 MyBatis 的一个重要特性,能够显著提高代码的可读性和可维护性。
MyBatis框架动态SQL的常用标签
标签 | 说明 |
---|---|
if | 条件判断,与Java中的计语句类似 |
where | 为SQL语句动态添加where关键字 |
choose | 条件判断,这是一个组合标签,需要yuwhen、otherewise标签搭配使用。可实现与Java中的switch语句类似的功能 |
foreach | 以便利方式处理集合类型参数 |
set | 为SQL语句动态添加set关键字,实现动态实现数据更新功能 |
trim | 对SQL语句进行格式化处理,添加或移除前后缀 |
一、if标签
if标签是MyBatis框架动态SQL技术中重要且常用的标签之一,它所实现的功能与Java中的if语句基本相同,用法也很相似。
select *
from t_sys_user
where 1=1
<if test="roleId != null">
and u.roleId = #{roleId}
</if>
<if test="realName != null and realName != '' ">
and u.realName like CONCAT('%',#{realName},'%')
</if>
二、where标签
where标签主要作用是对SQL语句中的where关键字进行简化处理,并可以智能的处理其内部and、or等关键字,避免多余字符带来的语法错误。
select *
from t_sys_user
<where>
<if test="roleId != null">
and u.roleId = #{roleId}
</if>
<if test="realName != null and realName != '' ">
and u.realName like CONCAT('%',#{realName},'%')
</if>
</where>
三、choose(when、otherwise)标签
choose标签是一个组合标签,通常与when、otherwise标签配合使用,实现了类似于Java中switch语句的功能。
select * from t_sys_user
<where>
<choose>
<when test="realName != null and realName != ''">
and realName like concal('%',#{realName},'%')
</when>
<when test="roleId != null">
and roleId = #{roleId}
</when>
<when test=" account != null and accont != '' ">
and account like concat('%',#{account},'%')
</when>
<otherwise>
and YEAR(createdTime) = YEAR(#{createdTime})
</otherwise>
</choose>
</where>
四、foreach标签
MyBatis框架通过foreach标签对这类参数进行循环处理,最终拼接出一个复合MySQL语法的in语句来处理这类参数。
select *
from t_sys_user
where roleId in
<foreach collection="参数名称" item="元素别名" open="(" separator="," close=")" index="当前元素位置下标">
#{元素别名}
</foreach>
语法中的属性介绍如下
属性 | 说明 |
---|---|
item | 遍历数组时,为数组或List集合中的元素起的别名 |
open | 起始位置的拼接字符,表示in语句以"("左括号开始 |
close | 结束位置的拼接字符,表示in语句以")"右括号开始 |
Separator | 元素之间的连接符,表示in语句中的元素之间以",逗号连接 |
Collection | 参数名称。 |
五、set标签
MyBatis框架动态更新数据的功能主要通过set+让标签实现。
update t_sys_user
<set>
<if test="account != null">account = #{account},</if>
<if test="realName != null">realName = #{realName},</if>
<if test="password != null">password = #{password},</if>
<if test="sex != null">sex = #{sex},</if>
<if test="birthday != null">birthday = #{birthday},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="address != null">address = #{address},</if>
<if test="roleId != null">roleId = #{roleId},</if>
<if test="createdUserId != null">createdUserId = #{createdUserId},</if>
<if test="createdTime != null">createdTime = #{createdTime},</if>
<if test="updatedUserId != null">updatedUserId = #{updatedUserId},</if>
<if test="updatedTime != null">updatedTime = #{updatedTime},</if>
</set>
六、trim标签
where、set标签能够动态的为SQL语句添加前后缀,并可以智能的忽略标签前后多余的and、or或逗号等字符。
update t_sys_user
<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
<if test="account != null">account = #{account},</if>
<if test="realName != null">realName = #{realName},</if>
<if test="password != null">password = #{password},</if>
<if test="sex != null">sex = #{sex},</if>
<if test="birthday != null">birthday = #{birthday},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="address != null">address = #{address},</if>
<if test="roleId != null">roleId = #{roleId},</if>
<if test="createdUserId != null">createdUserId = #{createdUserId},</if>
<if test="createdTime != null">createdTime = #{createdTime},</if>
<if test="updatedUserId != null">updatedUserId = #{updatedUserId},</if>
<if test="updatedTime != null">updatedTime = #{updatedTime},</if>
</trim>
语法中的属性介绍如下
属性 | 说明 |
---|---|
prefix | 前缀,可以自动对trim标签所包含的语句是否有返回值进行判断。如果有返回值,则为SQL语句拼接相应的前缀。 |
suffx | 后缀,在trim标签包含的语句末尾拼接后缀。 |
prefixOverrides | 忽略的前缀,忽略trim标签内部首部指定的内容。 |
suffxOverrides | 忽略的后缀,忽略trim标签内部首部指定的内容。 |