Mybatis中#{}与${}的区别 Mybatis中#{}与${}的区别 .{ } 在预处理时,会把参数部分用一个占位符 ? 代替,而 ${} 则只是简单的字符串替换。

  • 在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。

  • .{ } 在预处理时,会把参数部分用一个占位符 ? 代替,而 ${} 则只是简单的字符串替换。

  • 例:name的值为张三

      select * from user where name = #{name};
    
      select * from user where name = '${name}';
    
  • 解析结果一样:

      select * from user where name = '张三';
    
  • 预编译中的处理是不一样:

      select * from user where name = ?;  -- #{}预处理
    
      select * from user where name = '张三';  -- ${}预处理
    
  • 因为 ${} 会导致 sql 注入的问题,开发中优先使用#{}。

  • 例:表名称为user;--

      select * from ${tableName} where name = '${name}';
    
  • 则动态解析之后 sql 如下:

      select * from user; -- where name = 张三;  -- 后面的会被注释掉,语句就变成了查询所有
    
  • 但是使用模糊查询时,常用 ${}进行拼接

  • 例:查询名字里带有小明(value)的信息

      SELECT * FROM USER  WHERE username LIKE '%${value}%';
    
  • 解析结果:

      SELECT * FROM USER WHERE username LIKE '%小明%' ;
    
  • 使用${}是字符串的拼接,记得加'${value}'

  • 例:

      SELECT * FROM USER  WHERE username = '${value}';