在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语句时,需要根据具体的需求选择合适的参数占位符。