这是${}与#{}的区别,#{}采用了预编译,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

【底层实现原理】MyBatis是如何做到SQL预编译的呢?其实在框架底层,是JDBC中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的SQL语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。

${}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击

简单说,#{}是经过预编译的,是安全的${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入

最新文章

  1. Windows phone 全景视图
  2. 提高开发效率的十五个Visual Studio 2010使用技巧
  3. Windows 2008 R2 Powershell 3.0
  4. BZOJ3946 : 无聊的游戏
  5. 体验应用程序在Mac/iPhone/iPad之间的Handoff
  6. SQL语法的重要知识点总结
  7. Centos7网络监控
  8. 实现JavaScript自定义函数的整合、链式调用及类的封装
  9. 分布式架构高可用架构篇_03-redis3集群的安装高可用测试
  10. swift 2
  11. php mysql PDO使用
  12. CSS 3层嵌套居中布局
  13. iOS开发——判断是否第一次启动
  14. NOIP初赛 之 哈夫曼树
  15. android申请多个权限的正确姿势
  16. ansible系列1-批量分发钥匙
  17. leetcode - [7]Binary Tree Preorder Traversal
  18. Android 拖动条 和 Handle
  19. Head First Python学习笔记2——文件与异常
  20. Nginx多个配置文件共用location配置

热门文章

  1. ACM-ICPC 2018 焦作赛区网络预赛 G Give Candies
  2. vue---分页搜索功能
  3. 随机生成n位随机数(包含大写字母、小写字母、数字)
  4. swift 学习- 26 -- 泛型
  5. socket-WebSocket-HttpListener-TcpListener服务端客户端的具体使用案例
  6. Swift 通过字符串创建控制器
  7. linux基础实操四
  8. cf1143E 倍增好题!
  9. Fiddler抓包2-只抓APP的请求
  10. Linux文本分析命令awk的妙用