Mybatis 中#和$的区别是什么? - 面试宝典
在MyBatis中,#
和$
是两种不同的参数占位符。 #
是预编译的占位符,它可以防止SQL注入攻击。当使用#
时,MyBatis会将参数值以安全的方式替换到SQL语句中,使用的是PreparedStatement的预编译机制。例如,如果我们使用#{name}
作为参数占位符,那么MyBatis会将该占位符替换为?
,并将参数值以安全的方式传递给PreparedStatement。 $
是字符串替换的占位符,它直接将参数的字符串值替换到SQL语句中。当使用$
时,需要注意SQL注入攻击的风险。因为参数值是直接替换到SQL语句中的,如果参数值中包含恶意的SQL代码,可能会导致安全问题。因此,使用$
时需要进行参数验证和过滤。 综上所述,#
是安全的占位符,适合用于大部分情况下,并且推荐在编写MyBatis SQL语句时使用#
进行参数的占位;而$
是字符串替换的占位符,适合用于一些特殊的需求,但需要注意防止SQL注入攻击。
下面是一个使用#
和$
的示例代码: 假设有一个User表,包含id、name和age字段。 使用#
的示例代码:
javaCopy code@Select("SELECT * FROM User WHERE name = #{name} AND age > #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
上述代码中,#{name}
和#{age}
都使用了#
作为占位符。MyBatis会将参数值以安全的方式替换到SQL语句中。 使用$
的示例代码:
javaCopy code@Select("SELECT * FROM User WHERE name = '${name}' AND age > ${age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
上述代码中,${name}
和${age}
都使用了$
作为占位符。注意,这里没有使用#{}
进行占位符的标识,而是直接使用了${}
。使用$
时,参数值会直接替换到SQL语句中,需要注意防止SQL注入攻击的风险。 需要注意的是,使用#
和$
的方式会影响SQL的执行方式和安全性,根据具体情况选择合适的方式。
- 点赞
- 收藏
- 关注作者
评论(0)