MyBatis-映射文件03-两种取值方法(# or $)
#{}:可以获取map中的值或者POJO对象属性的值
${}:可以获取map中的值或者POJO对象属性的值
区别:
#{}:是以预编译的形式设置到sql语句中;PreparedStatement,可以防止sql注入
${}:取出的值直接拼接在sql语句中;会有安全问题
示例:
sql:
select id,last_name,email,gender from tbl_employee where id = ${id} and last_name = #{lastName}
我们调用方法执行该sql,可以发现在控制台输出:
Preparing: select id,last_name,email,gender from tbl_employee where id = 1 and last_name = ?
可以看出使用 $ 取值是直接将值拼接到sql语句中,这样会存在sql注入的安全问题,因此大多数情况下都应该使用 # 来取值
但是,在某些情况下,比如原生sql不支持占位符的地方,例如分表查询,以部分表名为参数,要使用 $ 来取值
示例:
sql:
select id,last_name,email,gender from #{tablename}_employee where id