ibatis与mybatis中$和#的区别

本文深入探讨了mybatis和ibatis中$和#符号用于变量替换的区别,解析了它们在SQL语句中的作用及如何防止SQL注入。同时,介绍了几种模糊查询的方法,并对比了ibatis和mybatis的不同实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在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中的一种拼接方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值