MyBatis动态sql小结(二)

1.choose用法

上节的if标签提供了基本的条件判断,但是无法实现if...else,if..else...这样的逻辑,要实现这样的逻辑,需要用到choose when otherwise 标签,choose元素中包含when和otherwise两个标签,一个choose中至少有一个when,有0个或者一个otherwise。

在sys_user表中出了主键id外,我们认为user_name(用户名)也是唯一的,所有的用户名不可以重复,现在进行下面的查询:当参数id有值时,用id查询,当id没有值时,判断用户名是否有值,如果有值就用用户名查询,如果没有值,就使sql查询无结果。

  • select id, user_name userName, user_password userPassword, user_email userEmail, user_info userInfo, head_img headImg, create_time createTime from sys_user where 1=1 and id= #{id} and user_name = #{userName} and 1=2
  • 使用choose when otherwise 的时候逻辑要严密,避免由于某些值出现问题导致sql出错。

    2.where 、set、trim 用法

    2.1 where 用法
    where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果后面的字符串是以AND和OR开头就将他们(and和or)剔除。代码如下:

    	
  • select id, user_name userName,user_password userPassword, user_email userEmail,user_info userInfo, head_img headImg,createTime from sys_user and user_name = #{userName} and user_email = #{userEmail}

  • 2.2 set用法
    set标签的作用:如果该标签包含的元素中有返回值,就插入一个set,如果set后面的字符串以逗号结尾的,就将这个逗号剔除。代码如下:
    
        
        
         
         
      			update sys_user
      				
         
         
      					
          
          
           
           
      						user_name = #{userName},
      					
          
          
      					
          
          
           
           
      						user_password = #{userPassword},
      					
          
          
      				    id = #{id},
      				
         
         
      				where id= #{id}
      		
        
        
    在set标签的用法中,sql后面的额逗号是没问题了,但是set元素中没有内容,照样会出现sql错误。所以id=#{id}这个仍要保留。这个值得注意。

    2.3 trim用法
    where 和set 标签的功能都可以用trim标签来实现,并且在底层就是通过TrimSqlNode实现的
    where 标签对应的trim的实现如下:
    <trim prefix = "where" prefixOverrides="AND | OR ">
    ....
    </trim>
    重要:这里的AND和OR 后面的空格不能省略,为了避免匹配到andes,orders等单词。

    set 标签对应的trim的实现如下:
    <trim prefix = "set" suffixOverrides=",">
    .....
    </trim>

    trim标签有如下属性:
    prefix
    prefixOverrides
    suffix
    suffixOverrides




    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值