Mybatis系列:Mybatis中 $ 和 # 千万不要乱用!

导读:本篇文章讲解 Mybatis系列:Mybatis中 $ 和 # 千万不要乱用!,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不出来了,问题就在于一条sql上的#和$。

在这里插入图片描述在这里插入图片描述

从图上可以看出 wwlr.LabelId in(KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 33: …wlr.LabelId in(#̲{showLabels}),其…处理的方式是不一样的。


区别

  1. #{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 “4,44,514”就会变成“ ‘4,44,514’ ”;
  2. M

    y

    B

    a

    t

    i

    s

    { }是字符串替换, MyBatis在处理

    MyBatis{ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。

注意:使用${ }会导致sql注入,不利于系统的安全性!

SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等

应用场合:

  1. #{ }:主要用户获取DAO中的参数数据,在映射文件的SQL语句中出现#{}表达式,底层会创建预编译的SQL;

  2. 美元符号{ }:主要用于获取配置文件数据,DAO接口中的参数信息,当美元符号出现在映射文件的SQL语句中时创建的不是预编译的SQL,而是字符串的拼接,有可能会导致SQL注入问题.所以一般使用$接收dao参数时,这些参数一般是字段名,表名等,例如order by {column}。

注:

${}获取DAO参数数据时,参数必须使用@param注解进行修饰或者使用下标或者参数#{param1}形式;

#{}获取DAO参数数据时,假如参数个数多于一个可有选择的使用@param。


问题分析

其实刚开始我也没太去看sql里的#和$,我把sql放到数据库跑一切正常,所以我就将代码的执行sql输出到控制台了,具体是这么一个输出sql的配置文件:

在这里插入图片描述
看了上面的区别介绍,相信大家其实都应该知道区别在哪里,我们的问题在哪里,其实就是sql在in的时候 ,里面的数据被加了两个双引号。“wwlr.LabelId in(4,44,514)就会变成 wwlr.LabelId in(‘4,44,514’ );所以导致部分数据查不到了。


解决办法

1、快速解决

  • 最快的方法就是把#直接替换成$,这样问题应该就可以解决了。

  • 但是,我很无语,我确没有解决。

  • 大家都知道$其实是有危险性,会容易被sql注入

  • 当然,不用再到服务上打出sql看,因为本来$就是不太安全的,所以可以换一种方式处理。

2、foreach标签的使用

foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。

在这里插入图片描述

那对于我们项目中的改造,其实就是把原来传进来的字符型参数变成List,这样问题就完美的解决了,既实现了我们的功能 ,又解决了安全性问题。


到这里Mybatis中 $ 和 # 千万不要乱用,分享完毕了!下一波将分享《Redis的下载安装》和SpringBoot-Jpa-Redis案例分享!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97871.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!