回顾一下,在上一篇 MyBatis 之三(查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection)中,学习了针对查询操作的相关知识点,理解了占位符 #{}与 ${}的区别,还有 like 查询要使用 concat() 进行拼接,针对字段名称和属性名不同时要使用resultMap,重点学习了一对一查询用 association,一对多查询用 collection 以及这两个标签对应属性的学习
本篇将学习 MyBatis 强大特性之一的动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
if 标签作用:判断一个参数是否有值,如果没值,那就会隐藏 if 中的 sql
<insert id="add2">
insert into userinfo(username,password
<if test="photo!=null">
,photo
if>
) values(#{name},#{password}
<if test="photo!=null">
,#{photo}
if>
)
insert>
如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,按照 的做法,这就会导致可能某个字段后面出现“,”的问题
这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式
标签作用:去除 SQL 语句前后多余的某个字符,其属性有
<insert id="add3">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name!=null">
username,
if>
<if test="password!=null">
password,
if>
<if test="photo!=null">
photo
if>
trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name!=null">
#{name},
if>
<if test="password!=null">
#{password},
if>
<if test="photo!=null">
#{photo}
if>
trim>
insert>
where 标签作用:实现查询中的 where 替换,它可以实现如果没有任何的查询条件,那么它可以隐藏查询中的 where sql,但如果存在查询条件,那么会生成 where 的sql 查询,并且使用 where 标签可以自动的去除最前面的一个 and 字符
<select id="getUserById" resultMap="BaseMap">
select * from userinfo
<where>
<if test="id!=null">
and id=#{id}
if>
where>
select>
不传参数时
传参数时
where 标签也可以使⽤ trim prefix=“where” prefixOverrides=“and” 替换
set 标签作用:进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号
<update id="update2">
update userinfo
<set>
<if test="name!=null">
username=#{name},
if>
<if test="password!=null">
password=#{password},
if>
<if test="photo!=null">
photo=#{photo}
if>
set>
where id=#{id}
update>
set标签也可以使⽤ trim prefix=“set” suffixOverrides=“,” 替换
标签作用:对集合进行循环的。其属性
<delete id="delIds">
delete from userinfo where id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
foreach>
delete>