在MyBatis中,$
和#
是两种不同的参数占位符语法,它们在SQL语句中的使用方式和执行效果是不同的。
$
符号表示占位符的值会被直接拼接到SQL语句中,不会进行预编译处理。这意味着,$
符号后的参数值会被直接替换到SQL语句中,而不是被编译为参数,并在执行前传递给数据库。因此,使用$
符号时需要注意SQL注入问题。
示例:
<select id="getUsers" resultType="User">
SELECT * FROM user WHERE name LIKE '${name}%'
</select>
在这个例子中,${name}
会被直接拼接到SQL语句中,查询语句中的${name}
将被替换成实际的值。因此,如果name
参数包含恶意的SQL语句,则可能导致SQL注入攻击。
#
符号表示占位符的值将被预编译为参数,并在执行前传递给数据库。这种方式可以有效避免SQL注入问题。因此,在编写SQL语句时,建议使用#
符号。
示例:
<select id="getUsers" resultType="User">
SELECT * FROM user WHERE name LIKE #{name}%
</select>
在这个例子中,#{name}
会被预编译为参数,并在执行前传递给数据库,可以有效避免SQL注入问题。
因此,$
符号和#
符号在MyBatis中的区别是,$
符号表示直接拼接到SQL语句中,而#
符号表示将值预编译为参数,安全性更高。在编写SQL语句时,需要根据具体的需求选择合适的参数占位符。