最近接手了一个老项目,那种“愉悦的心情”自然是无法形容的,做开发的朋友都懂,这里就不多说了,都是泪……接手一个老项目,实在是自然是要先熟悉一下业务代码,但是在浏览mapper文件的时候,却发现了一件比较奇怪的事情。下面是简化的业务代码:select*fromuserwhere1=1andname=#{name}andpassword=#{password}机智的朋友可能已经看出问题所在,并在众多mapper中发现了相同的想象。几乎所有的映射器都包含一个无用的拼接SQL:where1=1。作为一个差不多有代码洁癖的人,我忍不住要做出一些改变。由于错误的转换方法是去掉where1=1,最简单的方法是直接从代码中删除,如下代码所示:select*fromuserwherename=#{name}andpassword=#{password}上面代码删除了1=1,去掉了名字查询中的and,防止SQL查询错误。但这可以吗?我们直接看结果。当包含参数名查询时,结果如下:一切顺理成章,一塌糊涂。但是,当省略name参数时(因为name是一个不必要的参数,可以省略),会触发如下异常:或者只查询password时,结果是一样的:都报错了,那怎么办我愿意?是否可以?还原1=1?正确的提升方式其实是没有必要的。这个问题在MyBatis中已经想到了。我们可以将SQL中的where关键字替换成MyBatis中的label,在每个label中加上and。拼接字符,于是问题解决,如下代码所示:select*fromuserandname=#{name}andpassword=#{password}if>代码改造完成后,我们来测试一下所有的请求场景。不传任何参数的请求这时候我们可以不传参数(查询所有数据),如下图:图片生成的SQL语句如下:为图片传1个参数的请求也可以传1个参数,根据name查询,如下图:图片生成的SQL如下图:也可以只根据密码查询图片,如下图:SQL图片生成的如下图所示:传递两个参数的请求也可以根据名称加密码的方式组合查询,如下图所示:生成的SQL如下图所示:用法分析我们惊喜地发现,使用标签后,无论在任何查询场景下,传递一个或多个参数,或者不传递任何参数,都可以轻松设置任何参数。首先标签会判断,如果没有参数,则在sql语句中不拼接where查询,否则拼接where查询;其次,在查询标签中,每个标签都可以加上and关键字,MyBatis会自动删除第一个条件前面的and关键字,以免造成SQL语法错误,官方文档中也有说明,如如下图所示:综上所述,在MyBatis中,建议避免使用无意义的SQL拼接where1=1,我们可以使用标签代替where1=1,简洁大方,何乐而不为呢?