Mybatis映射文件Mapper.xml中#和$的区别
1、"#"
简单来说"#"在编译时使用"?"占位符标记,可以有效防止参数注入,相当于我们使用JDBC操作时的PreparedStatement。
2、"$"
直接把参数拼接到SQL中执行相当于JDBC操作时的Statement
3、参数作为非SQL关键字传递
<insert id="addUser" parameterType="User">
insert into users values(default, "${username}", "${password}", "${photo}");
</insert>
或者把"$"改成"#"
<insert id="addUser" parameterType="User">
insert into users values(default, #{username}, #{password}, #{photo});
</insert>
4、参数作为关键字传递,比如查询条件全是由参数拼接的,只是用一条SQL,有时要按name列查,有时要按age列查
<select id="selectUser" parameterType="User" resultType="User">
select * from users where ${columnName} ${condition} #{columnValue}
</select>
SQL1:select * from users where username = "test";
SQL2:select * from users where userage like "%2";
因为列名和关系条件是关键字,是用"$",列值是非关键字,使用"#"。
三、总结
1、关键字作为参数,使用"$",两边不加""。
2、非关键字作为参数,使用"#"防注入。
其他情况优先使用"#"