ibatis sql中$和#的区别
2016-10-10 11:24
176 查看
情况:
今天碰到一个情况,就是一个列表页面,有多个刷选条件,如图
其实做起来很简单,相信没有任何难度,就是有些人就是会根据这4个条件各自写一段sql语句来获取数据。但我现在想直接用一条sql语句(其它都是一样的,只是刷选条件不一样),所以我的想法是把刷选的条件,以及刷选的方式(升序,降序)当成类似于变量的方式,这样就比各自写sql要简单很多
问题现象:
使用过ibatis的人知道我们大部分在传sql参数的时候都是用# #符号的,使用##的好处就是是预编译,提交效率以及防止sql注入问题;还有就是会进行类型匹配(这个自己可以网上查一下,简单的说就是##会根据你的字段的类型自动匹配参数类型)。然后回到我这个问题上,一开始我打算把刷选条、以及刷选的方式直接以参数的方式传进去,这样就可以直接一句sql。但后面发现这样做没有起任何作用,取出的数据没有按照我的刷选条件排序
解决问题:
这里回顾一下,我们之前用hibernate的时候,写sql有两种方式。第一种直接sql字符串拼接,然后执行sql;另一种是预处理sql,
等效于
prepareStement=stmt.createPrepareStement("select * from users where name = ?")
prepareStement.setString(1,'张三');
所以我上面直接将排序条件、排序方式已##参数的方式传进去,就相当于sql语句以后没有关于排序的语句,参数传进去肯定没有用了!!!
所以我改用$$的形式,传进去是当成sql语句的一部分,而不是预编译,当成变量部分。
总结
(1)变量的传递, 必须使用#,防止sql注入;# 是用prepareStement,提示效率。
#方式一般用于传入添加/修改的值或查询/删除的where条件
(2) $只是简单的字符拼接而已,对于非变量部分, 那只能使用$, 实际上, 在很多场合,$也是有很多实际意义的
$方式一般用于传入数据库对象.例如传入表名.
例如:
select * from $tableName$ 对于不同的表执行统一的查询
update $tableName$ set name = #name# 每个实体一张表,改变不用实体的状态
特别说明, $只是字符串拼接,所以要特别小心sql注入问题。
(3)能同时使用#和$的时候,最好用#。
今天碰到一个情况,就是一个列表页面,有多个刷选条件,如图
其实做起来很简单,相信没有任何难度,就是有些人就是会根据这4个条件各自写一段sql语句来获取数据。但我现在想直接用一条sql语句(其它都是一样的,只是刷选条件不一样),所以我的想法是把刷选的条件,以及刷选的方式(升序,降序)当成类似于变量的方式,这样就比各自写sql要简单很多
问题现象:
使用过ibatis的人知道我们大部分在传sql参数的时候都是用# #符号的,使用##的好处就是是预编译,提交效率以及防止sql注入问题;还有就是会进行类型匹配(这个自己可以网上查一下,简单的说就是##会根据你的字段的类型自动匹配参数类型)。然后回到我这个问题上,一开始我打算把刷选条、以及刷选的方式直接以参数的方式传进去,这样就可以直接一句sql。但后面发现这样做没有起任何作用,取出的数据没有按照我的刷选条件排序
解决问题:
这里回顾一下,我们之前用hibernate的时候,写sql有两种方式。第一种直接sql字符串拼接,然后执行sql;另一种是预处理sql,
select * from users where name = #name#
等效于
prepareStement=stmt.createPrepareStement("select * from users where name = ?")
prepareStement.setString(1,'张三');
所以我上面直接将排序条件、排序方式已##参数的方式传进去,就相当于sql语句以后没有关于排序的语句,参数传进去肯定没有用了!!!
所以我改用$$的形式,传进去是当成sql语句的一部分,而不是预编译,当成变量部分。
总结
(1)变量的传递, 必须使用#,防止sql注入;# 是用prepareStement,提示效率。
#方式一般用于传入添加/修改的值或查询/删除的where条件
(2) $只是简单的字符拼接而已,对于非变量部分, 那只能使用$, 实际上, 在很多场合,$也是有很多实际意义的
$方式一般用于传入数据库对象.例如传入表名.
例如:
select * from $tableName$ 对于不同的表执行统一的查询
update $tableName$ set name = #name# 每个实体一张表,改变不用实体的状态
特别说明, $只是字符串拼接,所以要特别小心sql注入问题。
(3)能同时使用#和$的时候,最好用#。
相关文章推荐
- iBATIS SQL Maps(二)
- SQL中UNION 与 UNION ALL 的区别
- DDS和SQL创建的表的区别
- iBATIS SQL Maps(一)
- iBATIS SQL Maps(一)
- SQL中char、varchar、text和nchar、nvarchar、ntext的区别
- SQL中exists和in的区别
- ORACLE和SQL SERVER的SQL语句中的一些区别
- 选择Data类型在Access与Sql中的区别
- v$sqlarea,v$sql,v$sqltext的区别和联系
- PreparedStatement 与 Statement 的区别 —— 理解动态SQL语句的执行机制
- IBatis.Net系列-多参数的SQL语句的配置
- Sql系统表中sysobjects 中的xtype和type区别
- 一道SQl考题 (循环和递归的区别)
- v$sqlarea,v$sql,v$sqltext这三个视图提供的sql语句的区别
- T-SQL中,View视图的应用:Left Join 和 Right Join的区别
- sql 语句中where条件和jion on条件的区别
- ACCESS中使用SQL语句应注意的地方、与sql server的区别及几点技巧(整理中)
- SQL使用OUTER JOIN查询,使用WHERE与AND的区别。
- iBATIS SQL Maps(二)