动态列名与使用 MyBatis 的 where 子句中的值进行比较

Dynamic column name compared with value in where clause using MyBatis

是否可以使用类似

的东西
SEARCH_QUERY = "select * from info where #{columnName}=\"#{columnValue}\"";

使用 MyBatis 3 ?

columnName 需要是动态的。

谢谢!

当你使用像#columnValue这样的语法时,mybatis 将创建准备好的语句并为你绑定变量。这会产生几个后果:

  1. 您不需要在 #columnValue
  2. 周围加上引号
  3. 您不需要转义传递的值
  4. # 只能在允许 JDBC 查询中的参数的情况下使用。所以你不能用它来生成动态列名

如果要生成动态查询,请改用 $columnName。完整的查询如下所示:

select * from info where ${columnName}=#{columnValue}

要记住的重要一点是,如果您直接使用 JDBC,${columnName} 就像字符串连接一样被逐字查询,因此它很容易受到 SQL 注入,如果 columnName 是用户提供的东西。