首页 > 代码库 > Mybatis 中 sql 语句的占位符 #{} 和 ${}

Mybatis 中 sql 语句的占位符 #{} 和 ${}

       #{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止   sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

       ${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。

下面举个例子来说明这两个的区别:

代码上来先:

<!-- 通过ID查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User">
        select * from user where id = #{v}
    </select>
    
    <!-- //根据用户名称模糊查询用户列表
    #{}    select * from user where id = ?    占位符  ? ==  ‘五‘
    ${}    select * from user where username like ‘%五%‘  字符串拼接  
    
     -->
    <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User">
        select * from user where username like ‘%${value}%‘
    </select>
    <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User">
        select * from user where username like "%"#{v}"%"
    </select>

  上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。

  id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,

  前者生成的 sql 为 select * from user where username like ‘%XXX%’;

  后者生成的 sql 语句是 select * from user where username like "%"‘XXX‘"%",(这样的格式我还没在 sql 中写过,但是的确能 run)

(XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。

Mybatis 中 sql 语句的占位符 #{} 和 ${}