在过往开发工作中,很多人应该碰到过在mybatis的SQL语句中使用where 1=1这个写法,或用过这个写法,这个写法一般在某条语句的where之后没有直接成立条件,而是需要用<if>来直接衔接语句,如果where后面直接拼接<if>,就会出现一种情况,如下图:
如type成立,则会进入拼接,拼接结果则是where deptid = #{deptid},如type或其他if条件都不成立,则会出现wher后为空,直接拼接order by,这种情况下就会报MyBatis 或sql异常。那么要是在where后拼接一个1=1呢,即不会报错,但是这个1=1会在查询过程中造成查询效率问题。所以我们应该尽量避免使用1=1这种无用条件。我们怎么解决这个问题呢?接着往下看。
在 MyBatis 中早已经想到了这个问题,我们可以将 SQL 中的 where 关键字换成 MyBatis 中的标签,并且给每个标签内都加上 and 拼接符,这样问题就解决了。下面我们看看优化后的代码:
这样,所有if条件不管成不成立,拼接都会正常,where标签会判断,如果没有任何参数,则不会在 SQL 语句中拼接 where 查询,反之才会拼接 where 查询;在查询的标签中,每个标签都可以加 and 关键字,MyBatis 会自动将第一个条件前面的 and 关键字删除掉,从而不会导致 SQL 语法错误,这一点官方文档中也有说明。在 MyBatis 中,建议尽量避免使用无意义的 SQL 拼接 where 1=1,我们可以使用标签来替代 where 1=1,这样的写既简洁又优雅,这个就是mybatis标签的妙用之处啦