54

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

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

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

stmt.setString(1, "tableName1");

请问我怎样才能让它成为一个动态变量?

4

4 回答 4

81

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

于 2012-07-03T13:43:03.987 回答
5

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

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

当你知道表名时替换

String query =strQuery.replace("$tableName",tableName);
stmt =conn.prepareStatement(query);
于 2013-01-10T13:00:22.043 回答
-1

一种选择可能是String.format

例如

String sql = String.format("INSERT INTO $1%s (col1, col2, col3, (etc)",  myTablename);
于 2012-07-03T15:43:43.913 回答
-5

如果您的表名仅来自您自己的代码...

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

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

如果表名来自任何其他不可靠的来源(用户输入,其他代码传入的参数),请不要这样做并查看其他答案!

于 2012-07-03T13:42:02.690 回答