今天在工作时,使用MyBatis中向sql传递两个参数时,一直显示SQL语法错误,仔细检查,才发现传入的参数被加上了引号,导致传入的参数(要传入的参数是表名)附近出现语法错误。

错误写法:

  select pro_type, name, b.info from #{0} a inner join #{1} b on a.config_id = b.config_id;

这种写法在控制台报错:

select pro_type, name, b.info from ? a inner join ? b on a.config_id = b.config_id;
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''dana.auto_kpi_cfg_info' a inner join 'kingnetio.meta_config_info' b on a.config' at line 1

我们发现通过占位符传进来的参数两个表名都被加上了引号,这就导致在执行SQL时,会报语法错误。

后来特地查阅相关资料,改成使用${}:

select pro_type, name, b.info from ${param1} a inner join ${param2} b on a.config_id = b.config_id;

控制台日志信息如下:

Preparing: select pro_type, name, b.info from dana.auto_kpi_cfg_info a inner join kingnetio.meta_config_info b on a.config_id = b.config_id;

在传入的表名参数上没有添加引号了。

现在特此整理这两种用法的不同点:

(1)首先一点就是,#{}传递参数时,会在传递的参数上加上引号,在传递属性比如   name=? 时,可以很方便的使用#{}。而${}则不会添加引号,传递的是什么就会直接放到SQL中去执行。

(2)通过上面的日志信息我们可以看到,#{}传递的参数实际上是通过占位符去传入到已经预编译好的SQL中去的,所以此时的SQL已经完成编译,只需要传参数就完成执行了。而${}在日志中显示的是直接将参数拼接成完整的SQL去DBMS中编译执行的。所以#{}方式实际上比${}方式更加安全,不会引起SQL注入。但是在传入表名参数时,只能使用${},这时候,必须要在接受参数的时候加入逻辑判断,判断参数中是否存在SQL语句,以防引起注入。

最新文章

  1. 给 DevOps 初学者的入门指南
  2. A ship is always safe at the shore - but that is not what it is built for.
  3. android的四层体系结构,基于mvc三层结构浅析
  4. RESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY))
  5. 【Android测试】【随笔】与 “58同城” 测试开发交流
  6. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
  7. flex 添加右键链接
  8. JS常用的设计模式(7)—— 外观模式
  9. leetcode@ [199] Binary Tree Right Side View (DFS/BFS)
  10. linux安装缺失服务
  11. How to: Signing Installers You Create with Inno Setup
  12. 搭建MHA环境【2】安装mysql-5.6 + mysql复制
  13. Windows 2008 R2安装.NET Framework 4提示灾难性故障解决方法
  14. prototype属性的理解
  15. App开发外包必须注意的四大骗局
  16. 关于Mybatis的一些随笔
  17. Neutron:Firewall as a Service(FWaaS)
  18. python标准库之random模块
  19. Visual studio中编译和使用libpng和zlib
  20. Finished yeah!

热门文章

  1. php学习之正则表达式
  2. Java (PO,VO,DAO,BO,POJO,DTO) 几种对象解释
  3. Maven学习-Profile详解
  4. iStat for mac
  5. CAP理论与MongoDB一致性、可用性的一些思考
  6. Interactive pivot tables with R(转)
  7. android学习-第一讲
  8. jQuery UI 入门之实用实例分享
  9. android Activity Application Context 的区别
  10. 搭建免费wifi,嗅探接入该wifi的所有网络信息