在使用mybatis框架开发项目编写SQL语句的时候,经常需要用到变量替换值,那么用来替换变量值的操作经常用到$和#这两个符号,同样在一些Java面试中也经常被问到它们的区别。那么它们在使用上面有什么区别呢?下面根据使用情况分析总结,两者的区别。


#占位符的特点

1. MyBatis处理 #{ } 占位符,使用的 JDBC 对象是PreparedStatement 对象,执行sql语句的效率更高。

2. 使用PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全

3. #{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。

$占位符的特点 

1. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。

2. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。

3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。

4. ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。


1.#和$两者含义不同

#会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理。

而$则是把传入的数据直接显示在sql语句中,不会添加双引号。

比如:

 其中如果传入的username类型为字符型,比如输入zhangsan,那么username=#{username}#表示的就是username=”zhangsan”,如果传入的username类型为数值类型,比如输入11,那么username=#{username},#表示的就是username=”11”。

其中如果传入的username类型为整型类型,那么在执行sql语句时就不会出错,但是如果传入的username类型为字符串型,比如输入zhangsan,那么username=${username}就会变成username=zhangsan,执行会报错,所以sql语句必须写成下面这样。

2.两者的实现方式不同

 

(1)$作用相等于是字符串拼接

 相当于使用StringBuffer的append方法将${username}$追加在

select username,pass from t_login where username=后面,拼接在一起

(2)#作用相当于变量值替换

相当于使用PreparedStement接口来对#{username}#来进行赋值操作。

3、#和$使用场景不同

(1)在sql语句中,如果要接收传递过来的变量的值的话,必须使用#。因为使用#是通过PreparedStement接口来操作,可以防止sql注入,并且在多次执行sql语句时可以提高效率。

(2)$只是简单的字符串拼接而已,所以要特别小心sql注入问题。对于sql语句中非变量部分,那就可以使用$,比如$方式一般用于传入数据库对象(如传入表名)。

例如:

select * from ${tableName},$ 对于不同的表执行统一的查询操作时,就可以使用$来完成。

(3)如果在sql语句中能同时使用#和$的时候,最好使用#。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐