mybatis中#{}与${}取值的区别
1. 首先对于一个接口
Employee getEmpByIdAndName(@Param("id") Integer id,@Param("empName") String empName);
2. 然后是他的sql语句
<select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
select \* from t_employee where id=#{id} and empname=#{empName}
</select>
3. 我们可以观察到控制台的日志
DEBUG 09-08 19:49:57,254 ==> Preparing: select * from t_employee where id=? and empname=? (BaseJdbcLogger.java:159)
DEBUG 09-08 19:49:57,298 ==> Parameters: 1(Integer), zxj(String) (BaseJdbcLogger.java:159)
DEBUG 09-08 19:49:57,396 <== Total: 0 (BaseJdbcLogger.java:159)
4. 如果将sql语句中的#{id}修改为${id}
- 注意此处的where id=${id}
<select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
select \* from t_employee where id=${id} and empname=#{empName}
</select>
5. 我们再来观察日志
DEBUG 09-08 19:51:49,080 ==> Preparing: select * from t_employee where id=1 and empname=? (BaseJdbcLogger.java:159)
DEBUG 09-08 19:51:49,106 ==> Parameters: zxj(String) (BaseJdbcLogger.java:159)
DEBUG 09-08 19:51:49,123 <== Total: 0 (BaseJdbcLogger.java:159)
6. 我们可以看到where处,id由原来的=?,修改为=1。
结论:
- #{}:参数预编译,参数的位置都是由?替代,之后再设置进去,防止sql注入
- ${}:不是参数预编译,而是直接与sql语句拼串,不安全
tips:对于sql来说,只有参数位置支持预编译,而如果想查询不同的表,就需要使用到${}
比如:对于日志文件,会进行分表操作,log_2020,log_2019,如果想要查询不同表的信息,就需要用到${}
不行:select * from #{tableName}
行:select * from ${tableName}
mybatis中#{}与${}取值的区别的更多相关文章
- Mybatis中$和#取数据的区别
Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...
- 浅析mybatis中${}和#{}取值区别
mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...
- mybatis中 ${}和#取值小记(Parameter index out of range)
mybatis mapperxml文件中有两种取值法.${}和#{} $的是原样,#的是取值并转成指定?#{ele1,jdbcType=VARCHAR} 有个坑, 错误的写法 <if test= ...
- UI:字典的两种取值的区别
字典的两种取值的区别 (objectForKey: 和 valueForKey )参考 一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等 ...
- Loadrunner中参数化取值方式分析
Loadrunner中参数化取值依赖两个维度: 1.取值顺序分为“顺序”“随机”“唯一”. select next row:Sequential , Random,unique 2.更新值时分为 ...
- Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题)
Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题) 一.总结 一句话总结: Laravel 会首先收集需要写入 Session 的所有数据,并在用户的 ...
- mybatis映射文件参数处理 #{}取值与${}取值的区别
#{}:是以预编译的映射,将参数设置到sql语句中,和jdbc的preraredStatement一样,使用占位符,防止sql注入. ${}:取出的值会直接拼装在sql中,会有安全问题. 大多数情况下 ...
- jquery data方法取值与js attr取值的区别
<a data-v="3"></a> jquery data方法的运行机制: 第一次查找dom,使用attributes获取到dom节点值,并将其值存到缓存 ...
- (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)
原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...
随机推荐
- COM笔记-类厂
CoCreateInstance实际上并没有直接创建COM组件 ,而是创建了一个被称作是类厂的组件.而所需的组件正是由些类厂创建的.类厂组件的唯一功能就创建其他的组件.创建组件的标准接口是IClass ...
- commandBinding 的命令
<Window x:Class="WpfApplication1.Window29" xmlns="http://schemas.microsoft.com/win ...
- 14.SpringMVC之文件上传下载
SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...
- 十:JavaWeb中的监听器(一)
2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...
- STM32+Air202+Air530+HXDZ-30102-ACC心率血氧GPS采集上传到阿里云
所有资料都在QQ群1121445919 主要功能 HXDZ-30102-ACC采集心率血氧数据 STM32通过串口将数据转发到air202模块 air202将数据上传到阿里云平台进行展示与处理 整合合 ...
- Android:绘制字符
根据FontMetrics的特点,将字符在矩形框中居中显示:
- win系统打不开CHM文件(例如JDK的API)
打开文件乱码,打开时弹出乱码 前提说明,存放路径不得有中文,文件名也不能有中文 检查下面三个文件: hh.exe文件放置电脑 C:\Windows目录下: hhctrl.ocx ,its ...
- WIN7下安装Python3.7和labelImg-1.7.0
安装python3.7 官方https://www.python.org/downloads/windows/,下载windows 64bit python3.7版本 用Administrator权限 ...
- MFC中L, _T(),TEXT,_TEXT区别以及含义
字符串前面加L表示该字符串是Unicode字符串. _T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变.因此,Visual C++里边 ...
- HashMap 为什么线程不安全?
作者:developer http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线 ...