Mybatis中#和$的区别

最近在工作中用到了mybatis,其中传入数据时,有时用的$有时则是#,上网搜了而一下以进一步了解他们二者之间的区别:

Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}

我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,举个例子:

DELETE FROM A WHERE B = #{XX,jdbcType=VARCHAR}

这样的传值进去是带引号的,而是用$传值则是直接传递参数字符串,不带引号,例如前台想传过来某表名时就不能用#,要用$ ":

select A, B from ${_parameter}

但是使用$的时候会存在被注入攻击的危险:

例如 原本的语句是传入A

SELECT A,B FROM A,看上去没什么问题,

但是如果传入的值是:A;drop table A;  ,这条数据实际执行时便是:

SELECT A,B FROM A;DROP TABLE A; 变成了删除该表!本来一条查询语句就变成了删除,这就是注入攻击的风险.

因此要么不用$,要么就对传入值做出严格的控制.

总结:

#{} 这种取值是编译好SQL语句再取值
${} 这种是取值以后再去编译SQL语句
 

你可能感兴趣的:(工作)