Mybatis中#{}和${}的区别
场景:假设数据库有两个数据一模一样的表。历史表,当前表
查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。
希望使用1个方法来完成操作。即根据不同的表名查询数据。
使用${}可以查询到数据
使用#{}不可以查询到数据
${}与#{}区别:
${} 是字符串拼接,通过${}可以将传入的内容拼接在sql中且不进行jdbc类型转换。
#{} 是占位符,相当于PreparedStatement使用占位符去替换参数,自动进行java类型和jdbc类型转换,可以防止sql注入。
所以${}字符串拼接可以拼接表名执行sql语句,但 #{}占位符只能站位参数,而不是站位表名,所以不可以执行sql语句。
#{},${} 都可以接收一个简单类型、多个简单类型、实体类型。
1)一个简单类型
如果parameterType传输一个简单类型,#{}括号中可以是value或任意名称,因为 #{} 只是表示占位,与参数的名字无关,如 果只有一个参数,会自动对应。
如果parameterType传输单个简单类型值,${}括号中只能是value。 如果想换成任意名称,可以在方法上添加@Param。
2)多个简单类型
单个简单类型参数时,#{}与参数名无关
多个简单参数时,#{} ,${}与参数名都有关,写法一致。
解决办法,多个参数都添加@Param,参数名称必须一致。
3)实体类型,#{} 内填对应的实体属性名即可,而${} 还是需要@Param接收。
面试题(#、$区别)