mybatis的xml中<trim>标签的用法

1. 前言

  1. 在工作中离不开跟数据库打交道,目前流行的固然是mybatis,在xml中写sql的时候,可能会出现下面情况:

    <select id="select" resultType="User">
       select * from user2
       where 
         <if test="name != null">
            name = #{name}
         </if>
         <if test="pwd != null">
             and pwd = #{pwd}
         </if>
    </select>
    

    上述写法问题,sql中可能会有where条件,但是条件的个数未定,且条件任意一条都随机成立
    1. 情况一:name与pwd 都不为空,sql正常
    2. 情况二:name不为空,pwd为空,sql正常
    3. 情况三:name为空,pwd不为空,sql异常,因为sql就变成select * from user2 where and pwd = #{pwd}
    4. 情况四:name、pwd都为空,sql异常,因为sql就变成select * from user2 where

  2. 针对上述情况,有人可能会这样子解决,确实完全解决上述出现的问题,并且简单,但是唯一就是出现 1 = 1,很不美观:

    <select id="select" resultType="User">
       select * from user2
       where 1 = 1
         <if test="name != null">
            and name = #{name}
         </if>
         <if test="pwd != null">
             and pwd = #{pwd}
         </if>
    </select>
    
  3. 为了追求更好的写法,因此则稍微研究了一下:mybatis中自带的标签完美解决这个事情,如下文。

2. 先说结论

  1. mybatis中有标签,语法如下:

    <trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
    <!--名词解析-->
    prefix:若条件成立,在trim标签内sql语句前面加上前缀
    prefixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,前面去掉多余前缀内容
    suffix:若条件成立,在trim标签内sql语句后面加上后缀
    suffixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,后面去掉多余后缀内容
    
  2. 例子:

        <select id="select" resultType="User">
             select * from user2
             <trim prefix="where" prefixOverrides="ADN|and" suffix="" suffixOverrides="">
                 <if test="name != null and name.length() > 0">
                   and name = #{name}
                 </if>
                 <if test="pwd != null and pwd.length() > 0">
                  and pwd = #{pwd}
                 </if>
             </trim>
        </select>
    
    1. 情况一:name与pwd ,都不为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    2. 情况二:name不为空,pwd为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    3. 情况三:name为空,pwd不为空,则trim内的sql语句前加上where 并且去掉pwd多余的前缀and
    4. 情况四:name、pwd都为空,则trim内的sql语句直接不存在

3. 验证

  1. 最终XML的sql如下写:

    <select id="select" resultType="User">
             select * from user2
             <trim prefix="where" prefixOverrides="ADN|and">
                 <if test="name != null">
                   and name = #{name}
                 </if>
                 <if test="pwd != null">
                   and pwd = #{pwd}
                 </if>
             </trim>
    </select>
    

1. 情况一

  1. 当name与pwd 都不为空时,trim内sql前面加上where,并去掉name前面的前缀and
    在这里插入图片描述

2. 情况二

  1. 当name不为空,pwd为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    在这里插入图片描述

3. 情况三

  1. name为空,pwd不为空,则trim内的sql语句前加上where 并且去掉pwd多余的前缀and
    在这里插入图片描述

4. 情况四

  1. name、pwd都为空,则trim内的sql语句直接不存在
    在这里插入图片描述

5. 验证prefixOverrides去掉的是trim内原sql内容

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值