点击蓝色“程序猿DD”关注我哟

加个“星标”,不忘签到哦

来源:http://t.cn/E9ZjUEJ


开头

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

下图为两条sql:

从图上可以看出 wwlr.LabelId in(${showLabels}) 和 wwlr.LabelId in(#{showLabels}),其中showLabels是传进来一个字符串类型的参数,参数的样子是这样的“4,44,514”,问题就出在这个参数传进来后#和$处理的方式是不一样的。

区别

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

2、${ }是字符串替换, 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、快速解决

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

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

本地跑代码一点问题都没有,部署到公司的docker上问题一样没解决,给人的感觉就是代码根本没有从#变$。

大家都知道$其实是有危险性,会容易被sql注入,具我所知道,我们公司的docker是会加一层防止 sql注入的功能 ,所以不知道是不是这个功能把的$无效掉了。

当然,我也没有去再到服务上打出sql来看一下,因为本来$就是不太安全的,所以我换了一种方式处理。

2、foreach标签的使用

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

先来看看语法:

通过上图,大家也应该也了解和使用这个标签了吧。

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


推荐阅读

  • 一千个不用 Null 的理由

  • 推荐一款让你纵横Github的读码神器

  • 还在使用 SimpleDateFormat?你的项目崩没?

  • 公益:开放一台Nacos服务端

  • Nacos部署中的几个常见问题

号外:最近整理了之前编写的一系列内容做成了PDF,关注我并回复相应口令获取:

001 :领取《Spring Boot基础教程》

002 :领取《Spring Cloud基础教程》


活动介绍:自律到极致-人生才精致:第6期

活动奖励:《Service Mesh实战》* 10

扫描下面二维码签到参与

关注我,加个星标,不忘签到哦~

2019

与大家聊聊技术人的斜杠生活

Mybatis中 $ 和 # 千万不要乱用!相关推荐

  1. 工作发狂:Mybatis 中$和#千万不要乱用!

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 开头 这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不到出来了,问题就在于一条sq ...

  2. 严格模式 华为_华为千元机虽然好,但是千万别乱选,这三款才是内行人的最爱...

    现在5G高端旗舰代表着厂商的技术水平,不过这些5G旗舰相比而言创造的收益却比较少,而大部分的效益是由5G中端机和5G千元机创造. 进入20年后,华为也开始在千元手机市场上发力,其中有三款5G千元机配置 ...

  3. 山东师范大学志愿推荐系统邀请码_快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦...

    快看点邀请码填写HGC1QK 快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦 快看点官网下载是一款非常好玩的软件,喜欢此类风格的用户可以体验一下哦. 快看点官网下载特色系统: 如此好玩的 ...

  4. 微信头像存在哪个服务器,使用微信头像有讲究,千万别乱用!

    原标题:使用微信头像有讲究,千万别乱用! 1.拒绝凄凉的背景风光,如荒漠.雪山.孤霞.萧条的落叶等,这往往更加重内心的负能量. 2.图像不可用过于凶猛的动物,如狮子.老虎.大雕.巨蟒.巨蜥.鳄鱼等,久 ...

  5. 护卫神mysql提权_护卫神主机大师被提权漏洞利用(可千万不能乱装护卫神主机大师安装的软件)...

    原标题:护卫神主机大师被提权漏洞利用(可千万不能乱装护卫神主机大师安装的软件) "护卫神·主机大师支持一键安装网站运行环境(IIS+ASP+ASP.net+PHP5.2-5.6+MySQL+ ...

  6. source环境变量命令千万不能乱用

    我在arm摄像头的/etc目录下敲了一下source命令,没带参数,结果环境变量全都乱了....

  7. Mybatis中example的使用

    Mybatis有很简单的方式来完成sql语句的编写 如下: int id = 2; ClusterExample ClusterExample = new ClusterExample(); Clus ...

  8. MyBatis中if - else if - else 的使用

    http://www.leftso.com/blog/765.html 不过有他的替代  choose,写法如下: <choose><when test="params!= ...

  9. oracle 在 MyBatis 中使用 like

    2019独角兽企业重金招聘Python工程师标准>>> 两种使用方法 使用oracle自带 || 拼凑的方式 <if test="userName!=null and ...

最新文章

  1. 一看就会的20个“非常有用”的python小技巧,你一定要试试
  2. python网络编程及高并发问题
  3. 使用JSTL报错:items does not support runtime expre...
  4. 【机器视觉】 dev_set_colored算子
  5. ps学习1:去除图片上的文字
  6. 【OpenCV 例程200篇】24. 图像的仿射变换
  7. 安卓教程:提取APK程序里图片资源的方法
  8. 微软将不再把 .NET Framework API 移植到 .NET Core 3.0
  9. html里用js实现随机抽奖,javascript实现随机抽奖功能
  10. 天线3db波束宽度_天线尺寸与频率,口径与波宽的关系
  11. Windows Server 2008的介绍及其与Windows Server 2008 R2的区别
  12. pathon的安装与环境部署,数据类型
  13. Hrbust 1162 魔女 【dp】
  14. 深度揭秘腾讯云新一代企业级HTAP数据库TBase核心概念
  15. 不等距双杆模型_电磁感应之双杆模型.ppt
  16. DB2数据库安装与配置
  17. Ubuntu系统在终端中重启与关机
  18. 为什么建议大家使用 Linux 开发?爽++
  19. 计算机word知识点小技巧,史上最全的Word技巧大全 掌握这些你也能成为Word高手...
  20. 关于PlatformIO开发 Arduino,自定义库的设置

热门文章

  1. pycharm 调试错误 Connection to Python debugger failed: Socket operation on nonsocket: configureBlocking
  2. 从TXT文本文档向Sql Server中批量导入数据
  3. VS 的makefile工程
  4. OD命令大全(OllyDbg命令)
  5. 100多个Android Demo的整合
  6. P2P网络中DHT算法分析
  7. DirectFB实例1--加载一幅图片
  8. Linux内核网络性能优化
  9. java ee中javamail注解_JavaEE之注解
  10. html求和按钮,使用模板标记在html模板中求和