当前位置: 首页 > 科技观察

Mybatis的where标签还有这么多未知数!

时间:2023-03-11 21:31:56 科技观察

背??景在上一篇文章中,我们系统学习了where1=1相关的知识点。大家可以回头参考这篇文章《??不要再用where 1=1了!有更好的写法!??》。文章涉及Mybatis的替代方案。有好学的朋友在评论区提出了基于Mybatis写的问题。于是,就有了这篇文章。本文将对Mybatis中where标签的基本使用形式、技巧和容易踩到的陷阱进行总结和整理,以便大家更好的实践和使用。原来手动拼接不使用Mybatis的where标签时,我们通常会根据查询条件进行手动拼接,即采用上面提到的where1=1的方式。示例如下:select*fromt_userwhere1=1andusername=#{username}andid_no=#{idNo}这个方法主要是为了避免语句拼接错误,出现如下错误SQL:select*fromt_userwhereandusername='Tom'andid='1001';select*fromt_userwhereandid='1001';添加1=1时,SQL语句正确:select*fromt_userwhere1=1andusername='Tom'andid='1001';select*fromt_userwhere1=1andid='1001';前面我们已经提到,MySQL数据库有一定的压力。因为1=1条件的优化过滤需要MySQL来做。如果能把这部分放到应用程序中,MySQL的压力就会减轻。毕竟,应用程序可以轻松横向扩展。Mybatiswhere标签的使用为了实现MySQL的性能调优,我们可以基于Mybatiswhere标签来实现。where标签是顶级遍历标签,需要和if标签配合使用,单独使用没有意义。通常有如下两种实现形式。方法一:select*fromt_userusername=#{username}andid_no=#{idNo}方法二:从t_userandusername=#{username}andid_no=#{idNo}仔细观察会发现这两种方法的区别在于第一个if条件中的s??ql语句是否有and。where标签有两个特点:第一,只有if标签有内容才会插入where子句;第二,如果子句的开头是“AND”或“OR”,where标签会把它插入替换和移除;所以,以上两种写法都可以,Mybatis的where标签会帮我们做一些事情。但需要注意的是,where标签只会智能地去掉(忽略)满足条件的第一条语句的前缀。所以建议在使用where标签的时候,每条语句都要加上and或or前缀,否则下面的写法会有问题:select*fromt_userusername=#{username}id_no=#{idNo}生成的SQL语句如下:select*fromt_userWHEREusername=?id_no=?显然,语法是错误的。因此,在使用where标签时,建议所有条件都加上andoror;进阶:在自定义trim标签上使用where标签实现拼接条件语句时,第一个条件的andoror会自动去掉,那么如果是其他自定义关键字是否也能去掉呢?此时where标签就束手无策了,trim标签就派上用场了,它也可以实现where标签的功能。从t_user中选择*andusername=#{username}andid_no=#{idNo}将上面基于where标签的写法改写成trim标签,发现执行效果完全一样。并且trim标签的定制更加灵活。where语句的坑另外,在使用where语句或者其他语句的时候,一定要注意一个地方,那就是:注释的使用。我们先看例子:select*fromt_userandusername=#{username}/*andid_no=#{idNo}*/andid_no=#{idNo}在上面的SQL语句中添加注释/**/,生成的SQL语句为:select*fromt_userWHEREusername=?/*andid_no=?*/andid_no=?执行的时候会直接报错。再举一个例子:select*fromt_user--和username=#{username}andusername=#{username}andid_no=#{idNo}生成的SQL语句是:select*fromt_userWHERE--andusername=?和用户名=?和id_no=?它还会导致错误。这是因为我们在使用XML配置SQL的时候,如果在where标签后面加上注释,那么当有满足条件的子元素时,除了注释会被where忽略,其他//或/**/或--等注释会被where当作第一个子句元素,导致后面真正的第一个AND子句元素或OR子句元素无法成功替换前缀,从而导致语法错误错误。同时,在实践中,个人经常发现SQL语法错误或错误结果是由于XML中的注解使用不当造成的。强烈建议,但不是必须,不要将XML中的SQL注释掉,可以使用版本管理工具追溯历史记录和修改。总结本文以Mybatis中where标签的使用为基础,对其用法、特点以及扩展到trim标签的替代作用进行了扩展。同时也提到了使用时可能出现的陷阱。内容虽然简单,但是能好好练习,避免踩坑,也是一种能力的体现。