ibatis的$与#区别

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如:
[sql]
select * from table where id = #id# [/sql]
其中如果字段id为字符型,那么#id#表示的就是’id’类型,如果id为整型,那么#id#就是id类型。
[sql]
select * from table where id = $id$ [/sql]
如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成
[sql]
select * from table where id = ‘$id$’
[/sql]
在做in,like 操作时候要特别注意
总结如下:
1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by “id”,这当然会报错..
2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了.
3.#方式能够很大程度防止sql注入.
4.$方式一般用于传入数据库对象.例如传入表名.
5.一般能用#的就别用$.
6.#使用的是PreparedStatement机制,生成的SQL字符串中含有很多?,这些?会被动态的添加参数进去查询$中的变量好比字符串直接替换。
PS:
#变量名# 会转化为 jdbc 的 ?,比如
[sql] select * from user where name=#name# [/sql]
会转化为jdbc的
[sql] select * from user where name=?[/sql],
把?参数设置为name的值,而$变量名$就直接把 $name$替换为 name的内容,也就是由可能
[sql]select * from user where name=$name$ [/sql]
如果name为 “‘ ‘ or 1 = 1”, 那么这样就有可能导致sql注入,所以ibatis用#比$好,不会造成sql注入。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据