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 ...
随机推荐
- 使用nginx构建限频、限速、限并发的应用保护层
使用nginx构建限频.限速.限并发的应用保护层 nginx本身提供了基础的限频.限速.限并发连接等能力. 限频 基于uri等限制某一个客户端,某类客户端持续时间段内建立连接的次数. 限速 限制客户端 ...
- ES-实战
一.环境准备 操作系统:mac 依赖的软件:JDK1.8.Postman.NodeJs6.0以上.Maven.Idea ES下载:Elastic官方网站: http://www.elastic.co ...
- HTTP报文学习
HTTP报文用于HTTP协议的信息交互,分为请求报文和响应报文.报文由首部和主体两部分组成,中间使用空行(CR+LF)分隔 1. 报文结构 报文由首部.空行和实体组成: 报文中首先是请求行或者状态行, ...
- HDU - 2196(树形DP)
题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...
- N分成不同的数相乘使答案最大
题意:http://acm.hdu.edu.cn/showproblem.php?pid=5976 首先队友想出了分的越多答案越多. 我们就:2,3,4,5,6...多出来的尽量往小了加就行了. #d ...
- hdu 1869 枚举+Dijstra
一点小变形就是了..] #include<iostream> #include<cstdio> #define maxn 201 #define inf 999999 usin ...
- where用法
where 子句用于指定类型约束. 1.接口约束 public class MyGenericClass<T> where T:IComparable { } 2.基类约束: 指出某个类 ...
- 关于页面数据未保存改变路由(beforeunload,beforeRouteLeave)
一下内容为笔者个人理解,如有出入还请大佬指出不胜感激 页面有数据未保存,用户离开页面分为两种 1 . 直接关闭浏览器标签 或者点击浏览器后退按钮 离开当前页面 2. 在页面内改变路由,或则刷新页面(不 ...
- css四种定位
概述:元素定位属性主要包括的模式和边偏移两部分,也就是说以后定位要和边偏移量搭配使用.边偏移加定位定位模式才能构成一个完整的定义方式. 偏移量说明: 边偏移属性 描述 top: 顶端偏移,定义元素相对 ...
- mybatis+oracle 批量插入,若数据库中有则做更新操作
1.只批量插入: insert into WXPAY_ACCOUNT(id ,out_trade_no ,transaction_id)select SEQ_WXPAY_ACCOUNT.nextval ...