Ibatis的#和$的区别
来自别人的:https://blog.csdn.net/findmyself_for_world/article/details/49976555
总结:凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。$很不安全,可能出现sql注入攻击风险。
在实际中,除了like语句外,也有人经常对in参数使用$$,如a.ORDER_STATUS in( $orderStatus$ )
对于一条简单的sql语句,例如:
Select * from user where id=#id#
Ibatis会把sql预编译为
select * from user where id=?
接着会把传入的值进行填充,类似于jdbc的preparestatment的形式。
之前的sql是简单的形式,加入需要用到模糊查询的like就比较麻烦,而且可能会出现sql注入的情况。
假如需要查询用户名中带"sa"的用户,可能会这样来写sql
select * from user where name like '%sa%'
但是在ibatis的xml中不能这样写,如果写成
select * from user where name like #%sa%#或者like %#sa#%是肯定不行的,会有报错。
有个很简单的办法,就是写成
select * from user where name like '%$name$%'
的样子,$符号会把参数原样嵌入sql语句中而不进行预编译,这就使得有可能出现sql注入攻击。其实ibatis从根本上简单的说,凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。 所以说,$很不安全,会把用户的输入直接当参数放入sql。
结论:最好不要用like来进行查询,1是因为效率低,2是因为在ibatis里使用是相当麻烦的,可读性很差,如果真的要用,不要使用$,而是使用#的like拼凑形式:
select * from user where name like '%'||#name#||'%';
Ibatis的#和$的区别的更多相关文章
- ibatis 中 $与#的区别
ibatis 中 $与#的区别 使用#: select * from table where id = #id# 如果字段为整型:#id#表示成id select * from table where ...
- ibatis中 $ 于 # 的 区别?
转自: http://www.blogjava.net/lsbwahaha/archive/2009/04/16/266026.html 一个项目中在写ibatis中的sql语句时,where use ...
- ibatis和mybatis的区别
区别1:全局配置文件(sqlMapConfig.xml)的差异 主要是元素标签命名的差异,比如mybatis的根元素标签为<configuration>,ibatis的 根元素标签为< ...
- ibatis与mybatis的区别
一.最主要的区别就是mybatis简化了编码的过程,不需要去写dao的实现类,直接写一个dao的借口,再写一个xml配置文件,整个mybatis就配置好了,也就是数据库就连接好了,然后再service ...
- ibatis .net $与#的区别
$与#的区别 SELECT * FROM TABLE WHERE Id = #id# 其中如果字段id为字符串类型,那么#id#表示的就是'id',也就是说会自动加引号.如果id为整型,那么#id#就 ...
- MyBatis/Ibatis中#和$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111&qu ...
- ibatis中$和#的区别
比如当变量name的类型是Stirng时, $name$ 打印出来的是 张三 #name# 打印出来的是 ‘张三’ $ 的作用实际上是字符串拼接 #用于变量替换 那什么时候用$,什么时候 用 # (1 ...
- 五、ibatis中#和$的区别和使用
1.#和$两者含义不同#:会进行预编译,而且进行类型匹配:$:不进行数据类型匹配.示例:变量name的类型是string, 值是"张三" $name$ = 张三 #na ...
- ibatis 中#和 $ 符号的区别
1.数据类型匹配 #:会进行预编译,而且进行类型匹配(自动确定数据类型): $:不进行数据类型匹配. 2.实现方式: # 用于变量替换(先生成一个占位符,然后替换) select * from use ...
随机推荐
- Redis(七):Jedis简介和集群
Jedis简介 1.Jedis 是Redis 客户端工具jar2.使用非集群版示例代码 Jedis jedis = new Jedis("192.168.139.132", 637 ...
- maple minimax函数
numapprox[minimax] - minimax rational approximation Calling Sequence minimax(f, x=a..b, [m, n], w, ...
- 关于Unity层级面板的自动初始化
Transform[],GameObject[]这些class类型,Unity会进行自动初始化. 但[ExecuteInEditMode]在编辑模式下执行的时候,会发现初始化其实也是有顺序的,并且在U ...
- location if (.....) #if与中括号之间要有空格
[root@web01 default]# /app/server/nginx/sbin/nginx -t nginx: [emerg] unknown directive nginx: config ...
- zend server mac 下配置
Post Installation on Mac OS X If you intend to use PHP and other tools provided by Zend Server (pear ...
- 解决Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist.
1.错误症状:右击tomcat server,选择start,出现下图所示错误 2.错误原因: 我为了方便管理,把tomcat安装到了当前的eclipse-project目录下:E:/workspac ...
- hdu 1006 Tick and Tick 有技巧的暴力
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- (译).NET4.X并行任务Task需要释放吗?
摘要:本博文解释在.NET 4.X中的Task使用完后为什么不应该调用Dispose().并且说明.NET4.5对.NET4.0的Task对象进行的部分改进:减轻Task对WaitHandle对象的依 ...
- STM32CubeMX新建工程+基本IO配置过程
Ⅰ.写在前面 学习本文之前可以查看我前面的文章: STM32CubeMX介绍.下载与安装 STM32CubeMX使用方法及功能介绍 本文接着上一篇文章结合基本IO配置实例,讲述关于STM32CubeM ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...