Mybatis中#{}和${}的区别

场景:假设数据库有两个数据一模一样的表。历史表,当前表

查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。

希望使用1个方法来完成操作。即根据不同的表名查询数据。

Mybatis中#{}和${}的区别

使用${}可以查询到数据

Mybatis中#{}和${}的区别

使用#{}不可以查询到数据

Mybatis中#{}和${}的区别

 

${}与#{}区别:

${} 是字符串拼接,通过${}可以将传入的内容拼接在sql中且不进行jdbc类型转换。

#{} 是占位符,相当于PreparedStatement使用占位符去替换参数,自动进行java类型和jdbc类型转换,可以防止sql注入。

所以${}字符串拼接可以拼接表名执行sql语句,但 #{}占位符只能站位参数,而不是站位表名,所以不可以执行sql语句。

 

#{},${} 都可以接收一个简单类型、多个简单类型、实体类型。

1)一个简单类型

     如果parameterType传输一个简单类型,#{}括号中可以是value或任意名称,因为 #{} 只是表示占位,与参数的名字无关,如       果只有一个参数,会自动对应。

     如果parameterType传输单个简单类型值,${}括号中只能是value。 如果想换成任意名称,可以在方法上添加@Param。 

 Mybatis中#{}和${}的区别

Mybatis中#{}和${}的区别

 

2)多个简单类型

    单个简单类型参数时,#{}与参数名无关

    多个简单参数时,#{} ,${}与参数名都有关,写法一致。

解决办法,多个参数都添加@Param,参数名称必须一致。

Mybatis中#{}和${}的区别

Mybatis中#{}和${}的区别

 

3)实体类型,#{} 内填对应的实体属性名即可,而${} 还是需要@Param接收。

 

 

面试题(#、$区别)

Mybatis中#{}和${}的区别

Mybatis中#{}和${}的区别