在JDBC程序中动态创建表名

时间:2013-08-03 07:36:25

标签: java sql jdbc

我正在尝试使用excel准备考勤表,并希望将文件保存为.csv格式,这将与mysql进行链接。如何通过jdbc程序动态创建表名。 任何帮助都不胜感激。

2 个答案:

答案 0 :(得分:2)

您必须通过“string bashing”生成SQL。例如:

   String tableName = ...
   String createTableSQL = "Create table " + tableName;
   Statement statement = connection.createStatement(createTableSQL);
   statememt.execute();

等等。

警告:此方法存在风险。特别是,如果您根据用户输入的字符串或从电子表格或CSV或其他内容中读取的字符串生成表名,则可以输入实际上是SQL语句的字符串。最终结果是,他们可能会欺骗您的程序对您的数据库执行有害的SQL。

对此的正常防御是使用PreparedStatement,并对SQL中所有用户提供的详细信息使用占位符。不幸的是,这仅适用于注入SQL值。你不能用表名,列名和其他各种东西来做这件事。

答案 1 :(得分:1)

您可以使用.sql+shellmysql command-line-client

撰写mysql-dataloader脚本

骨架应该是这样的:

  • 使用您的应用程序生成名为.csv的{​​{1}}文件。
  • 'Shell Command':根据某些逻辑创建table_name(例如attendence_dd_mm_yyyy.csv)。
  • 'Mysql命令':使用attendence_dd_mm_yyyy
  • 'Data-loader':使用mysql -u usename -ppassword -e <Create table tablename> <fixed columns>将csv加载到新创建的表中。

我知道我有点偏离主题仍然建议这个选项,因为

  • 数据加载器非常快速且随时可用。
  • 它将解决您在创建表格后必须完成的数据加载问题。
  • 您无需将mysql -u usename -ppassword -e LOAD DATA INFILE ...提供给您的应用程序代码。如果您的代码进入DDL permission或类似的话,可能会出现问题。
  • 问题infinite loop也会影响其他连接的应用程序(如果有的话)。
  • 如果您的网络应用程序类似或类似,propagate to DB是您的方法的SQL-Injection

如果您使用任何其他数据库,请使用类似的行。