目录
动态SQL
一、 标签
二、标签
三、标签
四、标签
五、标签
动态SQL
动态 SQL 是 MyBatis 的强大特性之一,使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
一、 <if> 标签

在注册用户时,有些信息是必填的,有些信息是非必填的,比如咱们CSDN的信息,用户昵称是必填的....其余的比如个人简介、出生日期、开始工作都是非必填的程序应该 如何实现呢?
这个时候就需要使用动态标签 <if> 来判断了,比如添加的时候性别 photo为非必填字段,具体实现如下:
<if>语法:

    <insert id="add2">
        insert into userinfo (username,
        <if test="photo!=null">
            photo,
        </if>
        password)
        values(#{username},
        <if test="photo!=null">
            #{photo},
        </if>
        #{password})
    </insert> 

空的和null一样吗?

在MySQL中null和空是不一样的
 
二、<trim>标签
如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,
这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式
标签作用:去除 SQL 语句前后多余的某个字符,其属性有
- prefix:表示整个语句块,以prefix的值作为前缀
 - suffix:表示整个语句块,以suffix的值作为后缀
 - prefixOverrides:表示整个语句块要去除掉的前缀
 - suffixOverrides:表示整个语句块要去除掉的后缀
 
语法:

调整 UserMapper.xml 的插入语句为:
<insert id="add3">
        insert into userinfo
<!--     prefix:添加前缀  suffix:添加后缀 suffixOverrides:去掉最后面的',',有则去,无则不去-->
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="username!=null">
                 username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="photo!=null">
                photo,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                #{username},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="photo!=null">
                #{photo},
            </if>
        </trim>
    </insert> 

 
三、<where>标签
where 标签作用:实现查询中的 where 替换,它可以实现如果没有任何的查询条件,那么它可以隐藏查询中的 where sql,但如果存在查询条件,那么会生成 where 的sql 查询,并且使用 where 标签可以自动的去除最前面的一个 and 字符
<select id="getListByParam" resultType="com.example.demo.eneity.Userinfo">
        select * from userinfo
        <where>
            <if test="username != null">
                username=#{username}
            </if>
            <if test="password != null">
                and password=#{password}
            </if>
        </where>
    </select> 

当咱们只传一条参数时
 那我们来看看只给password值时会不会出问题呢?
这就是where标签的特征,
- where 标签会去除最前面的 and 关键字不会去除最后面的 and 关键字
 - where 标签通常配合 if 标签一起使用
 - where 标签中如果没有内容,那么不会生成 where sql 关键字
 
where 标签也可以使⽤ trim prefix=“where” prefixOverrides=“and” 替换
四、<set>标签
根据传入的用户对象属性来更新用户数据,可以使用<set>标签来指定动态内容。
UserMapper 接口中修改用户方法:根据传入的用户 id 属性,修改其他不为 null 的属性:
用来判断进行update操作的
<update id="update2">
        update userinfo
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
            <if test="photo!=null">
                photo=#{photo},
            </if>
        </set>
        where id=#{id}
    </update> 
注意:#{photo}后面有一个’,‘号,而我们这次更改的就是photo,且我们能够正常运行


特征:
- set 标签通常要配合 if 标签一起使用
 - set 标签会自动去除最后一个 英文符号
 以上<set>标签也可以使用 <trim prefix="set" suffixOverrides=","> 替换。
五、<foreach>标签
对集合进⾏遍历时可以使用该标签。<foreach>标签有如下属性:
- collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
 - item:遍历时的每⼀个对象
 - open:语句块开头的字符串
 - close:语句块结束的字符串
 - separator:每次遍历之间间隔的字符串
 
语法:

UserMapper 中新增接口方法:
    int dels(List<Integer> ids); 
UserMapper.xml 中新增删除 SQL:
<delete id="dels">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete> 
单元测试代码,删除id为1,2和3的用户:
    @Rollback(value = false)
    @Test
    void dels() {
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        int result = userMapper.dels(ids);
        System.out.println("删除了:" + result);
    } 

 








![SpringBoot 底层机制分析[上]](https://img-blog.csdnimg.cn/img_convert/f32bf6f72df7ae50a20d0c0d93ad6b4d.png)











