mybatis 之 #{} 和 ${} 的区别
-
#{}表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止 sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。
Map作为参数类型,key和占位符中的名称一致即可,如果名称不一致那么将会把null,传递到占位符中。
注意:#{}占位符不能解决一下 3 类问题:
- 表名是动态的: Select * from #{table_name}
- 列名是动态的:Select #{column_name} from t_role
- 排序列是动态的: Select * from t_role order by #{columu}
-
${}表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{} 括号中只能是 value。
<!-- 通过ID查询一个用户 --> <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User"> select * from user where id = #{v} </select> <!-- //根据用户名称模糊查询用户列表 #{} select * from user where id = ? 占位符 ? == '五' ${} select * from user where username like '%五%' 字符串拼接 --> <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like '%${value}%' </select> <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like "%"#{v}"%" </select>