Ibatis 之 $ & #

本文详细介绍了在Ibatis中使用SqlMap进行SQL查询时,#和$符号在参数引用上的区别。重点讨论了它们如何影响SQL语句的生成,并通过实例展示了在传递整型和字符型数据时的不同行为。同时,文章指出使用$符号可以避免#符号带来的问题,提供了绕过Ibatis限制的方法,并强调了在使用$符号时需要注意的安全性和性能问题。
摘要由CSDN通过智能技术生成

 

Ibatis 之 $ & # 

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如:

select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。

select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '$id$' 

--------------------------------------------

实例如下: 

sql 代码

    update user set flag=#flag# where id in (#id#)        

    delete from user where id in (#id#)  

传递的id为1,2,3。但是数据却没有任何的修改。

后来查找了半天,原来原因就是这个#的问题。因为iBATIS默认会把“#”中间的变量作为字符串来处理。这样,就会出现这样的SQL 

sql 代码 

    update user set flag='1' where id in ('1,2,3')        

    delete from user where id in ('1,2,3')  

这样的SQL数据库当然是不会执行的。那我们只有绕开iBATIS了吗?

其实不用,iBATIS其实还提供了另外一种方式,那就是使用$来传递值。你使用$将你的变量括起来,iBATIS不会给这个变量做任何的处理,直接生成你要的SQL

sql 代码

    update user set flag=$flag$ where id in ($id$)       

    update user set flag=1  where id in (1,2,3)        

    delete from user where id in ($id$)        

    delete from user where id in (1,2,3)  

还可以用ibatis的iterate解决:

SQL:

    <select id="test" parameterClass="java.util.List" resultClass="test.Roadline">   

        select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in    

        <iterate open="(" close=")" conjunction=",">   

            #value[]#   

        </iterate>   

    </select>  

 

    List list = new ArrayList();   

    list.add("aaa");   

    list.add("bbb");   

 

    List rsList = sqlMap.queryForList("roadline.test", list);  

 

生成的sql:

    select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in (?,?)  

 

$中间的变量就是直接替换成值的

#会根据变量的类型来进行替换

比如articleTitle的类型是string, 值是"标题"的时候

$articleTitle$ = 标题

#articleTitle# = '标题'

 

注:使用$作为占位符。它可以直接把参数插入到SQL语句中,这在该SQL语句被转变为参数化语句之前就执行了。如此就会留下安全隐患,它可能给SQL注入有机可乘,而且过度使用还会有性能问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值