MyBatis中 #{} 和 ${} 的区别和用法
在使用MyBatis框架的时候,编写Mapper.xml映射文件时写sql语句的时候经常需要使用到变量,而变量的接收方式有以下两种:
- 使用 #{} 表示占位,和参数名无关,识别参数的类型
- 使用 ${} 表示拼接,和参数类型无关
#{}的用法
Dao接口方法中有两个参数.在Mapper.xml文件中如何使用#{}传参?
默认方式一:以从0开始的递增数字作为键,第一个参数是0,第2个参数就是1,以此类推
select * from user where id = #{0} and name = #{1}
默认方式二:以”param” + i 作为键,i是从1递增的数字,第一个参数键就是param1,第2个就是param2,以此类推
select * from user where id = #{param1} and name = #{param1}
在接口方法的形参前面加上注解@Param(“id”)和@Param(“name”),就可以使用如下形式
select * from user where id = #{id} and name = #{name}
${}的用法
获取参数的方式: {}底层其实使用的是OGNL表达式。在处理参数时,与#{}有很大差别
1. 当只有一个参数时:
MyBatis底层会把这个参数 以键为’value’的形式存入Map中,因此取值的时候,必须${value},或者通过@Param注解
2 . 当有多个参数时
此时必须以 param1、 {param2}方式或者@Param注解方式来获取参数
注意事项 :
1、${}在取值时,并不会进行预编译,而是直接拼接SQL语句,这样无法防止SQL注入问题
2、 取值的时候,需要自己判断参数数据类型,如果是字符串,还得自己加引号:” {}”
总结:#和$的区别与联系
区别:
1) #是占位符,会对SQL进行预编译,相当于?; $是做SQL拼接,有SQL注入的隐患
2) #不需要关注数据类型,Mybatis自动实现类型转换。 $必须自己判断数据类型
联系:
两者都支持通过@Param注解 指定参数名称,来获取参数值。推荐这种方式!