在MyBatis中使用#号会将相应参数做为占位符形式如:
select * from user where name = #{name} and age >= #{age};
会转为占位符形式:
select * from user where name = ? and age >= ?;
#号的功能非常强大,如果有自定义类型需要调整,如将java中自定义的枚举类型转换为数据库中的数字时,只需要自定义一个typeHandler,在参数中指定就可以。
如:
#{userType,javaType=com.freecloud.enum.UserType,jdbcType=NUMERIC,typeHandler=UserTypeHandler}
对于数值类型,还可以设置numericScale指定小数点保留的位数。
#{height,javatype=double,jdbcType=NUMERIC,numericScale=2}
使用这种形式可以有效避免SQL注入攻击,如果需要依赖用户传入字段做一些处理时,可以使用下边的$形式,但需要自己校验参数字段合法性,避免SQL注入工具。
在MyBatis参数语法中$符号表示字符串替换,也可以理解为是模板替换。
比如我想实现动态字段排序时可以使用如下形式实现:
order by ${orderName}
这样MyBatis在转换SQL时会将sql语句直接替换为以下方式:
select * from user order by name;
也可以实现一些动态列查询如:
select * from user where ${field} = #{fieldValue};
注意:$形式谨慎使用,需要防止过滤SQL注入。