0
点赞
收藏
分享

微信扫一扫

Mybatis的<where>,<if>等标签用法

彭维盛 2023-09-16 阅读 52

上节有介绍Mybaits传入参数不同类型的时候,对应的处理方法,这节要说下处理方法时候还会用到的另外几个标签,比如<where> ,<if>等。

我们首先说下<if>标签,看名字就知道是用来做判断的,放传入的参数为null或者为空字符串时,我们不希望它3参与筛选,我们可以用<if>标签过滤掉值为null或者是空字符串的字段。例如:

<select id="getUsers" parameterType="User" resultType="User">
    SELECT * FROM sys_user where 1=1
    	<if test="name != null and name != ''">
   	 		AND name = #{name}
    	</if>
</select>

在这里通过判断User对象中的name值是否为null或者是空字符串再决定是否需要拼接上此条件,就实现了对不符合条件的字段进行过滤了。不过可以注意到这里的sql中有加where 1=1,这个比较奇怪的写法是因为如果下面的name字段判断成立则需要加where,如果不成立则不需要加where,那么在写xml文件的时候就并不知道是否需要加上where了,只能通过添加1=1的方式,即使后面不成立,1=1总是成立的不会影响查询结果。如果成立的话,后面拼接上and name = #{name}也是没问题的。这里为了改善这种写法就引入了<where>标签。,它专为针对这种情况而产生的,通过<where>标签,这段xml可以修改成这样:

<select id="getUsers" parameterType="User" resultType="User">
    SELECT * FROM sys_user 
    <where>
    	<if test="name != null and name != ''">
   	 		AND name = #{name}
    	</if>
    </where>
</select>

下面再说一种用于逻辑的标签<choose>,它类似java代码中的switch-case语句,在<choose>标签中有多中可能,根据条件当一种情况成立时拼接此条件下的sql。否则拼接<otherwise>中的sql,例如:

<select id="getUserList" parameterType="User" resultType="User">
  SELECT * FROM sys_user
  <where>
    <choose>
      <when test="name != null and name != null">
        AND name = #{name}
      </when>
      <when test="nickName != null and nickName != null">
        AND nickName = #{nickName}
      </when>
      <otherwise>
        AND id = #{id}
      </otherwise>
    </choose>
  </where>
</select>

这里大概意思是,如果name的值有效就用name这一个过滤条件,如果name值无效,则使用nickName,如果name和nickName都无效就用id过滤。除此之外,用于处理sql逻辑的标签还有<trim>(取出多余字符),<bind>(拼接变了数据)等。不过这些不经常使用,想要了解的小伙伴可以去搜索下用法。

举报

相关推荐

0 条评论