• MyBatis中#{}和${}的不同和${}的妙用(转)


     

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

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

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

    问题出现:

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

    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

  • 相关阅读:
    数据库+mysql
    网络并发项目
    网络编程 IO模型
    并发编程之死锁、进程池、协程
    类的使用
    面向对象—多态,反射
    面向对象-三大特性
    继承与派生
    面向对象
    模块进阶(二)
  • 原文地址:https://www.cnblogs.com/muxi0407/p/11607572.html
Copyright © 2020-2023  润新知