如何为java预处理语句插入使用表名变量

时间:2012-07-03 13:36:52

标签: java sql variables dynamic prepared-statement

我正在使用java PreparedStatment对象来构造一系列批量INSERT查询。查询语句的格式为......

String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";

...所以字段值和表名都是变量(即,我有多个表格具有相同的列格式,每个表格将指向不同的一个)。如果我删除“?”,我可以让执行工作tablename变量和硬代码,但每个预处理语句将被插入到不同的表中,因此需要保留一个变量,我在使用...执行批处理查询之前立即填充...

stmt.setString(1, "tableName1");

我怎么能让它成为动态变量呢?

5 个答案:

答案 0 :(得分:56)

你做不到。您需要使用String.format构造带有字符串连接/占位符的sql。预准备语句用于列值而不是表名。

答案 1 :(得分:9)

您可以使用占位符代替表名,然后将其替换为您的表名。

String strQuery = "INSERT INTO $tableName (col1, col2, col3, col4, col5)
                   VALUES (?,?,?,?,?,?);";

并在你知道tablename

时替换
String query =strQuery.replace("$tableName",tableName);
stmt =conn.prepareStatement(query);

答案 2 :(得分:-1)

表名不能用作参数。它必须是硬编码的。尝试类似:

String tableName = "tableName1";
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";

答案 3 :(得分:-1)

一种替代方案可能是String.format

e.g。

String sql = String.format("INSERT INTO $1%s (col1, col2, col3, (etc)",  myTablename);

答案 4 :(得分:-2)

您需要将其添加到原始字符串中:

String tableName = "some_table_name";
// some other code
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";

你需要在strQuery中使用分号吗? (你可能会这样,对我来说看起来有点奇怪: - ))