我正在尝试使用 excel 准备考勤表,并希望将文件保存为 .csv 格式,进一步将其与 mysql 链接。如何通过 jdbc 程序动态创建表名。任何帮助都将不胜感激。
问问题
2347 次
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-client
mysql-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-Injection
则HUGE CONCERN
适合您的方法。
如果您正在使用任何其他数据库,请使用类似的方法。
于 2013-08-03T07:54:23.633 回答