MyBatis中#{}和${}的不同和${}的妙用(转)
2024-09-08 06:56:17
突然意识到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 '
这样就出现问题了。。。
最后总结下:
- 一般${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方。
- 而#{}一般用在用户输入值的地方!!
原文链接:https://blog.csdn.net/alex_81d/article/details/80897621
最新文章
- CSS基本知识1-CSS基本概念
- 解决 scroll() position:fixed 抖动、导航菜单固定头部(底部)跟随屏幕滚动
- Java单例类的简单实现
- 382. Linked List Random Node
- init/main.c
- 在meteor中使用支付,以及与服务器进行数据交互
- 如何在MVC中显示条形码图片(以内存流的方式)
- gitHub项目框架使用排名
- 关于textarea标签在谷歌跟火狐可以拖动大小
- html列表问题
- P2515 [HAOI2010]软件安装
- TGI
- Python记录11:叠加多个装饰器+有参装饰器
- 【Topcoder 10384】KingdomMap
- 如何在gvim中安装autoproto自动显示函数原型
- CSS:font-family常用字体中英文对照
- Linux命令(六) 查看文件 cat tac more less tail
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介【转】
- Python进阶 学习笔记(一)
- Docker 入门之docker容器创建
热门文章
- [转帖]Linux日期和时间的那些事儿
- postgresSQL常用命令
- SQL Server 学习之环境搭建
- SQLite进阶-17.视图
- 二叉查找树 &; B(B-)树 &; B+树 &; B*树
- 【规律】Growing Rectangular Spiral
- 怎样理解JS的预解析机制
- WebStorm 2017 最新激活方式
- _stscanf_s (sscanf)正则表达式
- scala中ClassOf、asInstenceOf、isInstanceOf三个预定义方法分析