ibatis 配置文件中取值有两种:#和$
如果传值为userName="zhangsan"
#userName# , ibatis会自动在它的外面加上引号,结果是这样的:select * from user where user_name = 'zhangsan' ;
$userName$ 则是把zhangsan作为字符串拼接到sql中,结果是这样的:select * from user where user_name=zhangsan;
#写法会采用预编译方式,将转义交给了数据库,不会出现注入问题;如果采用$写法,则相当于拼接字符串,会出现注入问题如:
userName = "zhangsan' or user_name like'%%";
select * from user where user_name like '%$userName$%'; 会变成
select * from user where user_name like '%zhangsan' or user_name like '%%%'; 这样就会查询出所有的数据。
解决方法如下:
mysql: select * from XXX where name like concat('%',#name#,'%')
oracle&db2: select * from XXX where name like '%'||#name#||'%'
SQL Server:select * from XXX where name like '%'+#name#+'%