我们都知道Mybatis的<where>标签是可以自动去掉子句第一个and或者or的,具体如下:
XML
<select id="selectSelective" resultType="com.study.entity.User">
select * from t_user
<where>
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
</where>
</select>
如果没有<where>的时候,我们如果name条件满足,就会出现如下的SQL语句:
sql
select * from t_user where and name = 'CLAY';
很明显看出多了一个and,那么加上<where>标签,它就会为我们自动去掉这个and,也就是第一个and。
那我们明白了这个前提,我们再看下一个SQL:
XML
<select id="selectSelective" resultType="com.study.entity.User">
select * from t_user
<where>
del_flag = '0'
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
</where>
</select>
那按我们刚才说的,<where>会去掉第一个and,那这个SQL语句不就变成了下面这样吗:
sql
select * from t_user where del_flag = '0' name = 'CLAY';
但其实结果并没有去掉这个and,还是正常的:
sql
select * from t_user where del_flag = '0' and name = 'CLAY';
这是因为<where>标签去掉的是紧贴着where后面的and或者or,中间隔一个单词都不行。
我们再看看官网怎么说: