0

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

4

2 回答 2

2

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

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

等等。

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

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

于 2013-08-03T07:49:38.877 回答
1

您可以使用和编写.sql+shell脚本mysql command-line-clientmysql-dataloader

骨架应该是这样的:

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

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

  • 数据加载器非常 - 非常快速且随时可用。
  • 它将解决您必须在创建表后完成的数据加载问题。
  • 你不需要给DDL permission你的应用程序代码。如果您的代码进入infinite loop或类似情况,可能会出现问题。
  • 问题也会propagate to DB影响其他连接的应用程序(如果有)。
  • 如果您的应用程序是 Web 应用程序或类似应用程序,SQL-InjectionHUGE CONCERN适合您的方法。

如果您正在使用任何其他数据库,请使用类似的方法。

于 2013-08-03T07:54:23.633 回答