相同点:都属于可以获取参数属性
#仅引用,在SQL语句中替代占位符的数值(赋值)
${attribute} 属于字符串拼接SQL,而非预编译占位符,会有注入攻击问题,不建议在常规SQL中使用,常用于可解决动态生降序问题。
但在动态表查询中会使用$
$符号注入攻击
<select id="selectUsersByKeyword" resultType="user">
SELECT * FROM t_user
WHERE name = '${name}' <!-- 会存在注入攻击 比如传入参数是 【String name = "tom' or '1'='1";】-->
</select>
以下为查询动态表:
// 演示一个$符号使用场景,动态表查询
@Select("select * from ${tableName}") // <select>
public List<Map<String,Object>> findData(@Param("tableName") String tableName);
List<Map<String, Object>> list = mapper.findData("t_emp");
for (Map<String, Object> map : list) {
System.out.println(map);
}
根据传递的表名不同,查询到不同的内容