常用动态标签分类
| 元素 | 作用 | 场景 |
|---|---|---|
| select、insert、update、delete | 定义sql语句类型 | 增删改查 |
| if、foreach、choose | 控制动态sql拼接 | 条件查询 |
| where、set、trim | 辅助元素 | 格式化输出 |
select 标签
常用属性介绍:
id:唯一指定标签的名字
parameterType:给SQL语句传递参数的数据类型
parameterMap:给SQL语句传递参数的数据类型,需要和<parameterMap…/>标签连用
resultType :查询结构返回的数据类型,自动进行封装操作
resultMap:查询结果返回的数据类型,会根据映射文件中来完成数据封装
<select id="detail" parameterType="java.lang.Integer" resultType="cn.model.User">
select id, age, `name`
from user
where id = #{id}
</select>
insert 标签
常用属性介绍:
id:唯一指定标签的名字
parameterType:给SQL语句传递参数的数据类型
parameterMap:给SQL语句传递参数的数据类型,需要和<parameterMap…/>标签连用
resultType :查询结构返回的数据类型,自动进行封装操作
resultMap:查询结果返回的数据类型,会根据映射文件中来完成数据封装
useGeneratedKeys:true为启用设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中
keyProperty:javabean中的属性名称
keyColumn:对应数据库的字段名称
<insert id="insert" parameterType="cn.model.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="age!= null">age,</if>
<if test="name != null">`name`</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="age!= null">#{age},</if>
<if test="name != null">#{name}</if>
</trim>
</insert>
update 标签
属性同 insert
<update id="update" parameterType="cn.model.User">
UPDATE user
<trim prefix="set" suffixOverrides=",">
<if test="age!=null">age = #{age},</if>
<if test="name!=null">`name` = #{name}</if>
</trim>
WHERE id = #{id}
</update>
delete 标签
属性同 insert
<delete id="delete" parameterType="java.lang.Integer">
UPDATE user
SET age= 13
WHERE id = #{id}
</delete>
if 标签
if标签是最常用的动态标签,可以和大部分标签结合使用
test:对要判断的字段来写限制条件
<if test="name != null and name != '' ">
and name = #{name}
</if>
foreach 标签
foreach 标签主要用于构建 in 条件,可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。
collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。
item :表示在迭代过程中每一个元素的别名
index :表示在迭代过程中每次迭代到的位置(下标)
open :前缀
close :后缀
separator :分隔符,表示迭代时每个元素之间以什么分隔
<select id="list" resultType="cn.model.User">
select id,age,name
from user
where id in
<foreach collection="idList" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
choose 标签
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
MyBatis 提供了 choose 元素,按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
if 是与(and)的关系,而 choose 是或(or)的关系。
<select id="list" parameterType="java.lang.Integer" resultType="cn.model.User">
select *
from user
<where>
<choose>
<when test="type == 1 ">and age = #{age}</when>
<when test="type == 2 ">and name = #{name}</when>
<otherwise>and sex = #{sex}</otherwise>
</choose>
</where>
</select>
where 标签
where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。
此外,如果标签返回的内容是以 AND 或 OR 开头的,则它会剔除掉
以下sql当 name 值为 null 时,查询语句会出现 “WHERE AND” 的情况
<select id="list" parameterType="java.lang.String" resultType="cn.model.User">
SELECT *
from user
WHERE
<if test="name!=null and name!='' ">
and name LIKE CONCAT(CONCAT('%', #{name}),'%')
</if>
</select>
解决该情况除了将"WHERE"改为“WHERE 1=1”之外,还可以利用 where标签
<select id="list" parameterType="java.lang.String" resultType="cn.model.User">
SELECT *
from user
<where>
<if test="name!=null and name!='' ">
and name LIKE CONCAT(CONCAT('%', #{name}),'%')
</if>
</where>
</select>
set 标签
当在 update 语句中使用 if 标签时,如果最后的 if 没有执行,则或导致逗号多余错误。
使用 set 标签可以将动态的配置 set关键字,和剔除追加到条件末尾的任何不相关的逗号。
<update id="update" parameterType="cn.model.User">
update user set
<if test="name!=null and name!='' ">
name = #{name},
</if>
<if test="age!=null and age!='' ">
age = #{age}
</if>
WHERE ID = #{id};
</update>
使用 set+if 标签修改后,如果age为null时,会剔除name追加到条件末尾的任何不相关的逗号
<update id="update" parameterType="cn.model.User">
update user
<set>
<if test="name!=null and name!='' ">
name = #{name},
</if>
<if test="age!=null and age!='' ">
age = #{age}
</if>
</set>
WHERE ID = #{id};
</update>
trim 标签
常用于insert、update语句中
trim属性主要有以下四个:
prefix:在trim标签内sql语句加上前缀
suffix:在trim标签内sql语句加上后缀
prefixOverrides:指定去除多余的前缀内容,如:prefixOverrides=“AND | OR”,去除trim标签内sql语句多余的前缀"and"或者"or"。
suffixOverrides:指定去除多余的后缀内容。
<update id="update" parameterType="cn.model.User">
update user set
<trim suffixOverrides=",">
<if test="name!=null and name!='' ">
name = #{name},
</if>
<if test="age!=null and age!='' ">
age = #{age},
</if>
</trim>
where id=#{id}
</update>
如果name和age的值都不为空的话,会执行如下语句,会忽略最后一个“,”
update user set name='XX',age='XX' /*,*/ where id='XX'
本文介绍了MyBatis框架中动态SQL的使用方法,包括select、insert、update、delete等标签的应用场景及其常用属性,同时还详细解析了if、foreach、choose等控制动态SQL拼接的元素。
1620





