我们在ibatis和mybatis中编写SQL语句时,经常需要用到变量替换,ibatis是mybatis的前身,所以很多东西都很相似
例如 $ 和 # 在两者中都可以用来变量替换,但是 $ 仅仅是简单的字符拼接,它是直接进行值替换,而且容易被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$'
select * from table where id = $id$ 等效于 StringBuffer sb = new StringBuffer(256); sb.append("select * from table id=").append(id); sb.toString(); select * from table where id = #id# 等效于 prep = stmt.createPrepareStement("select * from table id = ?"); prep.setInt(1, 1001);
同理的mysql中的 $ 与 # 的用法也是一样,${}表示值替换, #{}表示按照类型进行替换。
下面再给出几种模糊查询的方式,注意,这里是mybatis的,如果使用ibatis请使用 #name# 或 $name$ 替换
name like"%"#{name}"%" --按照类型进行变量替换
name like '%${name}%' --直接值替换,当值为字符串类型时需要在外围加上引号,否则会报错
name like concat('%',#{username},'%') --使用内置函数进行拼接,预防了使用$而出现的SQL注入风险
name like CONCAT('%','${name}','%') --同上,但是无法避免SQL注入风险
name like '%'||#{name}||'%' --此方式为ibatis中的一种拼接方式