使用java中的Prepared Statement创建动态名称表

时间:2017-01-09 12:04:35

标签: java sql oracle jdbc

我想在java for oracle创建一个表,同时从用户获取表的名称,或者像程序变量一样:

String query= CREATE TABLE ? (ID NUMBER , NAME VARCHAR2(20));
PreparedStatement preStatement = connection.prepareStatement(query );
preStatement.setString(1,tableNAME);

但我有INVALID TABLE NAME错误;

如何达到此目的(通过动态名称创建表格)?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您始终可以将tablename连接到字符串(在检查SQL注入的可能性之后)

String query= "CREATE TABLE " + tablename + " (ID NUMBER , NAME VARCHAR2(20))";

答案 1 :(得分:0)

在准备好的Statement中,它首先编译查询然后绑定值。因此,您无法通过预准备语句将tablename设置为查询。
正常将表名附加到查询会导致Sql注入 最好的方法是将表名列入白名单并检查其中的表名。并使用它。

其他 尝试下面的方法,它将避免SQL注入。

String tableName = urtablename;
String query= String.format("CREATE TABLE  \"%s\" (ID NUMBER , NAME VARCHAR2(20))", tableName.replace("\"", "\"\""));