select * from user where id=${id} and user_name=#{username}
Preparing: select * from user where id=2 and user_name=?
区别
1、#{}:是以预编译的方式将参数设置到 sql 语句中的,相当于 PreparedStatement 可以防止 sql 注入攻击
${}:是直接将值拼接到 sql 语句中的,会有安全问题
2、能用 #{} 就不用 ${}
3、原生jdbc不支持占位符的地方我们就可以使用${}进行取值。比如分表、排序。。。按年份分表拆分(其实我理解就是 #{} 获取的的参数有引号,而 ${} 获取的参数无引号)
select * from ${year}_salary where xxx;
select * from ${tableName} order by ${f_name} ${order}
4、#{}:更丰富的用法:
规定参数的一些规则:
javaType、jdbcType、mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能)
jabcType 通常需要在某种特定的条件下被设置
在我们数据为 null 时,有些数据库可能不能识别 mybatis 对 null 的默认处理,比如 oracle 会报JdbcType OTHER:无效的类型;因为 mybatis 的全局配置文件中默认是JdbcTypeForNull = OTHER,会把所有的 null 都映射的 Jdbc 的 OTHER 类型。
解决方案:
1、#{username,jdbcType=NULL};
2、把全局的 JdbcTypeForNull 改成 NULL
<!--
1、设置对应字段的 jdbcType 但是这个只针对这里的这个字段
-->
<insert id="addUser">
insert into user(user_name) values(#{username,jdbcType=NULL})
</inset>
<!--
把全局的 jdbcTypeForNull 的值改为 NULL
-->
<settings>
<setting name = "jdbcTypeForNull" value = "NULL" />
</settings>