Mybatis学习第三弹
今天正好学到#{}和${}取值,想到之前面试的时候面试官问 Mybatis 里面的占位符是什么,自己傻傻地说了一个 % ,希望你看完以后不要再犯跟我一样的错误了
1、#{} 是Mybatia 中的占位符,它是以预编译(PrepareStatement)的形式,将参数用特定值(“?”)设置到SQL语句中,同时能有效的防止SQL注入;
2、${} 是Mybatis中的拼接符,采用直接将取出的值拼装到SQL语句中的方式,这种方式会有SQL注入的风险;
在大多数情况下,我们都应该采用#{}的方式来取值,但是在原始JDBC不支持占位符的时候,我们就需要采用${}的方式取值,比如取分表表名、排序字段,按照年份分表拆分:
select * from ${year}_salary where xxx
select * from tbl_employee order by ${f_name} ${order}
此外,#{}还具有更丰富的用法,比如规定传入参数的一些规则;这些规则包括:javaType mode(存储过程) numericScale resultMap typeHandler jdbcTypeName expression(未来支持)
例如jdbc在某些特定情况下需要被设置,当数据为 null 时,有些数据库可能无法识别Mybatis 对 null 的默认处理,比如 oracle 数据库;由于 Mybatis 默认对所有的 null 都映射为原生 jdbc 的 OTHER 类型,但 oracle 并不支持这种类型,所以此时需要通过明确指定 jdbcType=null 或修改 Mybatis 全局配置文件 jdbcTypeForNull=null(在使用多个数据库厂商的产品时不推荐使用此方法,单一使用 oracle 时推荐使用此方法)来让 oracle 能识别 null 值。
关注微信公众号:Javall咖啡屋
每天更新各种技术学习心得体会