Mybatis中的
$
和#
两个传参方式的区别,$是在执行SQL前,将SQL拼接号,这种场景用于传递数组的情况,还有动态GROUP BY的情况,#
是将引用参数传递进去,#
这种方式可以解决到SQL注入的问题
Seasar中SQL参数注入
我们之前学过的Seasar框架中,有一个同Mybatis类似的框架S2Dao,里面对于 Sql参数的注入也提供了两种方式,/$xx/
和/*xx*/
,这两个传参方式不同的地方是,/$xx/
会在执行PreparedStatement的时候,就将/$xx/
引用的参数变成字符串,连接起来,/*xx*/
的参数都是用引号处理的。这个Seasar框架在小日本用得是比较多的,做过java对日开发的,都基本上接触到这个
Mybatis中参数注入
我比较了一下Mybatis和S2Dao项目,发现设计中有很多类似的地方,在Mybatis中,${xx} 和#{xx}同S2Dao类似,${xx}
引用的参数在执行PreparedStatement的时候,就会将字符串连接起来了,#{xx}
这个就是通过双引号的方式来连接数据
比如如下的SQL
// # 符号的情况
SELECT * FROM USER WHERE AGE = #{age} //到PreparedStatement 执行的时候,执行的SQL,会将参数传进去 SELECT * FROM USER WHERE AGE = ? // $符号的情况 SELECT * FROM USER WHERE AGE = ${age} //到PreparedStatement 执行的时候,执行的SQL会将参数拼接好 SELECT * FROM USER WHERE AGE = 16