MyBatis 之四(动态SQL之 iftrimwheresetforeach 标签)

Posted 快到锅里来呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 之四(动态SQL之 iftrimwheresetforeach 标签)相关的知识,希望对你有一定的参考价值。

文章目录

回顾一下,在上一篇 MyBatis 之三(查询操作 占位符# 与 $、like查询、resultMap、association、collection)中,学习了针对查询操作的相关知识点,理解了占位符 #与 $的区别,还有 like 查询要使用 concat() 进行拼接,针对字段名称和属性名不同时要使用resultMap,重点学习了一对一查询用 association,一对多查询用 collection 以及这两个标签对应属性的学习

本篇将学习 MyBatis 强大特性之一的动态 SQL

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

1. if 标签

if 标签作用:判断一个参数是否有值,如果没值,那就会隐藏 if 中的 sql

<!-- 添加用户(测试 <if> 标签),photo 是非必传参数 -->
<insert id="add2">
    insert into userinfo(username,password
    <if test="photo!=null">
        ,photo
    </if>
    ) values(#name,#password
    <if test="photo!=null">
        ,#photo
    </if>
    )
</insert>


2. trim 标签

如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,按照 的做法,这就会导致可能某个字段后面出现“,”的问题

这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式

标签作用:去除 SQL 语句前后多余的某个字符,其属性有

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

<!-- 添加用户,其中 username、password、photo 都是非必传参数 -->
<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>


3. where 标签

where 标签作用:实现查询中的 where 替换,它可以实现如果没有任何的查询条件,那么它可以隐藏查询中的 where sql,但如果存在查询条件,那么会生成 where 的sql 查询,并且使用 where 标签可以自动的去除最前面的一个 and 字符

<!-- 根据 id 查询用户 -->
<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” 替换


4. set 标签

set 标签作用:进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号

<!-- 修改用户, 测试 <set> 标签 -->
<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=“,” 替换


5. foreach 标签

标签作用:对集合进行循环的。其属性

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串
<!-- 删除用户,测试 <foreach> 标签 -->
<delete id="delIds">
    delete from userinfo where id in 
    <foreach collection="ids" open="(" close=")" item="id" separator=",">
        #id
    </foreach>
</delete>

以上是关于MyBatis 之四(动态SQL之 iftrimwheresetforeach 标签)的主要内容,如果未能解决你的问题,请参考以下文章

myBatis系列之四:关联数据的查询

java面试总结之四

Mybatis之动态sql

Mybatis之动态构建SQL语句

MyBatis之动态 SQL

mybatis 之动态sql 增删改查