上节有介绍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>标签,这段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>(拼接变了数据)等。不过这些不经常使用,想要了解的小伙伴可以去搜索下用法。