Mybatis映射文件Mapper.xml中#和$的区别

时间:2022-07-26 18:36:54

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、非关键字作为参数,使用"#"防注入。

其他情况优先使用"#"