${}和#{}
相同点:都可以获取map的值或pojo中对象属性的值。
不同点:#{}以预编译的形式,将参数设置在sql中,类似PrepareStatement。在sql中会是一个问号。可防止sql注入。
${}将值取出直接拼装在sql语句中。
一般表名动态(分表),或排序字段为动态时(按某个字段排序),使用${}
例如:select id,last_name lastName,email,gender from tbl_employee where id=${id} and last_name=#{lastName}
解析后:select id,last_name lastName,email,gender from tbl_employee where id=2 and last_name=?
#{}还有更丰富的用法就是可以传参数:
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
1、#{email,jdbcType=NULL};
2、jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>