突然意识到sql语句的独特语义要和代码分离,我们就不能够在代码中写sql语句!!比如我要用${}在MyBatis的sql中拼接排序类型的时候,我就不能够在Java代码中直接写参数字符串为Order By哪儿个类型

#{}和${}的基本不同我就不想说了,这里要说的是进一步对占位符和字符拼接的字面语义的领悟!!

#{}和${}基本不同在这篇文章的最后有提到过

占位符:占位符就是在某个地方占领一个位置,把它单独作为某个东西,比如这里就是把它作为 值。 
字符拼接:字符拼接就是简单的对字符串拼接。没有特殊的其它含义。

问题出现:

不知道大家有没有想过一个问题

SELECT * FROM #{tableName} //有没有想过??

上面我们已经说过了占位符的意义就是作为值的存在,所以如果作为值的话,那么发送的sql语句就是这样的:

SELECT * FROM  ?

大家都知道MyBatis中这种sql语句是要经过预编译的,虽然MyBatis并没有真正的用上数据库的预编译功能(因为数据库的预编译默认是关闭的。。。而且MyBatis底层也是使用PreparedStatement和Statement这两个对象,大家可以参考我的一篇博客Presatement和Statement深入理解+MySQL的预编译)。

大家都知道,带问号的sql语句是要传递参数的,好!!假如!!我们传入了参数user,那么查询语句就是这样的:

SELECT * FROM  'user'
  • 请问,这种sql语句能够执行成功吗??试试就知道了!!

很明显语法错误!!

那么有什么办法能够解决呢??

没错!!!${}能够解决这个问题,${}的功能是直接进行字符串拼接。这也是为什么${}不能够防止一般的sql注入攻击。因为它是拼接啊!!

这样写就行了:

SELECT * FROM ${tableName} //如果传入基本类型如字符串时就要把tableName改为value才能够成功取值。

普通sql注入过程:

SELECT * FROM user WHERE username like '' OR 'XX'='XX' OR ''

当用户输入:

' OR 'XX'='XX' OR '

这样就出现问题了。。。

最后总结下:

  1.  一般${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方。
  2. 而#{}一般用在用户输入值的地方!!

    原文链接:https://blog.csdn.net/alex_81d/article/details/80897621

最新文章

  1. CSS基本知识1-CSS基本概念
  2. 解决 scroll() position:fixed 抖动、导航菜单固定头部(底部)跟随屏幕滚动
  3. Java单例类的简单实现
  4. 382. Linked List Random Node
  5. init/main.c
  6. 在meteor中使用支付,以及与服务器进行数据交互
  7. 如何在MVC中显示条形码图片(以内存流的方式)
  8. gitHub项目框架使用排名
  9. 关于textarea标签在谷歌跟火狐可以拖动大小
  10. html列表问题
  11. P2515 [HAOI2010]软件安装
  12. TGI
  13. Python记录11:叠加多个装饰器+有参装饰器
  14. 【Topcoder 10384】KingdomMap
  15. 如何在gvim中安装autoproto自动显示函数原型
  16. CSS:font-family常用字体中英文对照
  17. Linux命令(六) 查看文件 cat tac more less tail
  18. 【原创】Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介【转】
  19. Python进阶 学习笔记(一)
  20. Docker 入门之docker容器创建

热门文章

  1. [转帖]Linux日期和时间的那些事儿
  2. postgresSQL常用命令
  3. SQL Server 学习之环境搭建
  4. SQLite进阶-17.视图
  5. 二叉查找树 & B(B-)树 & B+树 & B*树
  6. 【规律】Growing Rectangular Spiral
  7. 怎样理解JS的预解析机制
  8. WebStorm 2017 最新激活方式
  9. _stscanf_s (sscanf)正则表达式
  10. scala中ClassOf、asInstenceOf、isInstanceOf三个预定义方法分析