MyBatis提供了以下方法来防止SQL注入:
#{param}
)来代替直接拼接SQL语句中的参数值,通过预编译的方式将参数值传递给数据库,从而防止注入攻击。例如,使用参数化查询的MyBatis语句如下:
<select id="getUser" parameterType="String" resultType="User">
SELECT * FROM users WHERE username = #{username}
</select>
例如,使用动态SQL的MyBatis语句如下:
<select id="getUser" parameterType="User" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
${expression}
来直接拼接参数值,类似于字符串替换。但是需要注意,使用OGNL表达式语法可能存在SQL注入的风险,所以应该尽量避免直接拼接参数值。例如,使用OGNL表达式语法的MyBatis语句如下:
<select id="getUser" parameterType="String" resultType="User">
SELECT * FROM users WHERE username = '${username}'
</select>
最佳实践是使用参数化查询或动态SQL来防止注入攻击,而避免直接拼接参数值。