MyBatis 动态SQL

1 <if> 标签

在用户注册的场景下,可能会出现部分选项是非必填项,这种情况就需要根据用户输入情况动态调整我们的SQL:

以上次的代码为例:

我们要求输入时,gender字段可填可不填 

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

if标签内的gender 对应的是 UserInfo 类中的gender 

    @Test
    void insert2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("Ting");
        userInfo.setPassword("Ting");
        userInfo.setAge(16);
        //userInfo.setGender(2);
        System.out.println(userInfoXMLMapper.insert2(userInfo));
    }

当我们不填写gender时,构造的SQL语句中就不会包含gender相关的字段 

2 <trim> 标签

如果一个SQL语句中有多个非必填项,可能会导致一些问题:

    <insert id="insert3">
        insert into userinfo(username, password, age ,
        <if test="gender != null">
            gender,
        </if>
        <if test="phone != null">
            phone
        </if>) values (#{username}, #{password}, #{age}, 
        <if test="gender != null">
            #{gender},
        </if>
        <if test="phone != null">
            #{phone}
        </if>)
    </insert>

如果使用这个SQL语句时只输入了gender,没有输入phone,就会导致SQL后面多了一个逗号,导致badSQL,于是MyBatis引入了<trim>标签

<trim>标签有如下属性:

  1. prefix:表示整个语句块以prefix的值作为前缀
  2. suffix:表示整个语句块以suffix的值作为后缀
  3. prefixOverride是:表示整个语句块要去除的前缀
  4. suffixOverrides:表示整个语句块要去掉的后缀

调整xml文件:

    <insert id="insert3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            username, password, age,
            <if test="gender != null">
                gender,
            </if>
            <if test="phone != null">
                phone
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            #{username}, #{password}, #{age},
            <if test="gender != null">
                #{gender},
            </if>
            <if test="phone != null">
                #{phone}
            </if>
        </trim>
    </insert>

3 <where>标签

当我们需要使用条件查询某个数据时可以使用<where>标签:

    <select id="select1">
        select * from userinfo
        <where>
            <if test="age != null">
                and age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
        </where>
    </select>

<where>标签会生成where关键字并去除最前面的and,如果where标签中没有一个查询条件则不会生成where关键字。

 

 如果使用 <trim>标签则无法完成省略where的功能

4 <set> 标签

<set> 标签用于 update语句,会自动生成一个set关键字,并去除最后一个 逗号 :

    <update id="update1">
        update userinfo
        <set>
            <if test="username">
                username = #{username},
            </if>
            <if test="password">
                password = #{password},
            </if>
            <if test="age">
                age = #{age},
            </if>
            <if test="gender">
                gender = #{gender},
            </if>
            <if test="phone">
                phone = #{phone}
            </if>
        </set>
        where id = #{id}
    </update>

5 <foreach> 标签

对集合进行遍历时可以使用该标签,该标签有以下属性:

  • collection:绑定方法参数中的集合,如List,Set, Map或数组
  • item:遍历时的每一个对象名
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历对象之间的字符串

需求:根据多个id删除用户数据:

collection对应的是我们Java代码中定义的集合的名称,item属性的值必须和#{}中相同

6 <include> 标签

在xml文件中可能会存在很多的重复片段,我们可以使用<sql>标签把这些重复的片段封装起来,然后通过<include>标签引用:

    <sql id="allColum">
        id, username, password, age, gender, phone, delete_flag, create_time, update_time
    </sql>
    <select id="select" resultMap="resultMap">
        select 
        <include refid="allColum"></include>
        from userinfo
    </select>

 上面的这些功能也能使用注解的形式实现,只需在外面加上 <script>标签即可,不过一般不推荐使用注解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ting-yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值