2

JDBC用于连接到 Servlets 中的数据库(Oracle10)。
以下是我想要动态设置三个参数的查询。

  1. 表名
  2. 列名
  3. 价值

询问:

query = "select ? from ? where ? = ?";
mypstmt = con.prepareStatement(query);
mypstmt.setString(1, tableName);
mypstmt.setString(2, columnName);
mypstmt.setString(3, columnName2);
mypstmt.setString(4, value);

但上面的查询给了我错误:

java.sql.SQLException: ORA-00903: invalid table name

我检查了表名。这是正确的,如果我这样写查询:

query = "select "+columnName+" from "+tableName+" where "+columnName2+" = ?";

然后它执行得很好。

那么如果我想将Table nameand设置Column Namesmypstmt.setString(1,tableName)

Edit1 我想要 and 的原因是parameterize我允许用户选择/输入表名和列名,所以我想避免.Table nameColumn nameSQL Injection

4

3 回答 3

5

我们不能将表名直接传递给,PreparedStatement因为表名不能是绑定变量。准备好的声明

表示预编译 SQL 语句的对象。

SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用该对象多次有效地执行该语句。

您必须使用字符串连接构造 sql。使用存储过程,您可以使用动态 SQL动态传递表名。甚至查看这个 SO 答案以了解它为何受到限制。

于 2013-07-11T06:16:21.083 回答
3

您只能?在 SQL 查询中参数化列值。表/列参数化是不可能的,而是使用变量来构造这样的查询,例如:

void query(String tableName, String columnName, String queryColumnName String val) {
String query = "select "+columnName+" from "+tableName+" where "+queryColumnName+" = ?";
mypstmt.setString(1, val);
..
}
于 2013-07-11T06:19:13.020 回答
1

在 PreparedStatement 中,您只能替换值。您不能替换表名或列名。

于 2013-07-11T06:19:37.587 回答