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 '
这样就出现问题了。。。
最后总结下:
- 一般${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方。
- 而#{}一般用在用户输入值的地方!!
原文链接:https://blog.csdn.net/alex_81d/article/details/80897621
MyBatis中#{}和${}的不同和${}的妙用(转)的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 记录一次bug解决过程:mybatis中$和#的使用
一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...
- mybatis中#{}与${}的差别(如何防止sql注入)
默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...
- mybatis 中的where标签
mybatis中的where标签可以去除 开头的 and 或者 or 但是放在后面的不行 失败的: <select id="countNotesByParam" parame ...
- Mybatis中SqlMapper配置的扩展与应用(3)
隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...
- mybatis中使用使用模块化sql
主要使用到mybatis中的标签 <sql id="tempId"> select * from student <sql> 使用的标签如下: <in ...
- “mybatis 中使用foreach 传
为了帮助网友解决“mybatis 中使用foreach 传”相关的问题,中国学网通过互联网对“mybatis 中使用foreach 传”相关的解决方案进行了整理,用户详细问题包括:mybatismap ...
- Mybatis中的in查询和foreach标签
Mybatis中的foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separato ...
- mybatis中foreach的用法(转)
foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...
随机推荐
- Kubernetes---Pod hook
Pod hook(钩子)是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中.可以同时为Pod中的所有容器都配置 hook ...
- .Net Core 3.0原生Json解析器
微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...
- HDU 3333-Turing Tree-线段树+离散+离线
Description After inventing Turing Tree, 3xian always felt boring when solving problems about interv ...
- fiddler笔记:web session窗口介绍
1.web session列表的含义:(从左到右) # fiddler通过session生成的ID. Result 响应状态码. Host 接收请求的服务器的主机名和端口号. URL 请求资源的位置. ...
- django 中静态文件项目加载问题
问题描述: django项目中创建了多个app后,每个app中都有对应的static静态文件.整个项目运行时这些静态文件的加载就是一个问题,因为整个项目我只参与了一部分,项目部署之类的并没有参与.我写 ...
- java学习要想精炼掌握应运的必备知识(博文来源于网络)
一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常用数 ...
- linux命令自动补全
在linux中命令较长时,不易记忆,使用命令行自动补全,使用方便,配置方法记录如下 需要安装bash-completion 重启后生效 命令:yum install bash-completion,安 ...
- dl in image process
deep learning目前为止无论在分类还是检测上,都是整体的处理,而不会出现像sift这样的局部特征,这个问题或许如果能克服掉,能让检测效果更进一大步.
- 怎样查看或修改元素节点的id属性
使用 el.id; el表示获取到的元素节点, 如下所示: // HTML 代码 // <div id="app" class="c1">hello ...
- Stanford NLP 课程笔记之计算字符串距离
在自然语言处理任务中,有时候需要计算两个字符串之间的相似度,也可以称作是两者之间的距离,用最小编辑距离表示. 最小编辑距离用{Insertion,Deletion,Substitution}这三种操作 ...