2013-08-03 38 views
0

我想準備使用Excel考勤表,並希望該文件進一步節省.csv格式將這個銜接與mysql.How我可以通過JDBC程序動態創建一個表名。 任何幫助,不勝感激。在JDBC PROGRAME動態創建的表名

+2

使用JDBC http://www.mkyong.com/jdbc/jdbc-statement-example-create-a-table/ – user75ponic

+1

我建議修改你的計劃中的數據模型嘗試此表的創建。動態表格創建對我來說似乎不是一個好習慣,除非這個策略有一個很好的理由。 – LRA

+0

@ LRA-完全同意你的看法。但是,如果仍然需要,OP不應該使用應用程序代碼來做到這一點。 –

回答

2

你必須產生由「字符串撲」的SQL。例如:

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

等。

警告:這種方法存在風險。特別是,如果您基於用戶輸入的字符串或從電子表格或CSV或其他內容讀取的字符串生成表名,則可以輸入實際上是SQL語句的字符串。最終結果是他們可能欺騙你的程序對你的數據庫執行有害的SQL。

對這種正常的防禦是使用PreparedStatement,並使用佔位符所有的SQL中的用戶提供詳細信息。不幸的是,這隻適用於注入SQL值。你不能用表名,列名和其他各種東西來做到這一點。

1

你可以寫一個.sql+shell腳本mysql command-line-clientmysql-dataloader

骨架應該是這樣的:

  • 生成.csv文件中使用您的應用程序命名爲attendence_dd_mm_yyyy.csv
  • 'Shell命令':創建一些邏輯(例如attendence_dd_mm_yyyy)的基礎TABLE_NAME。
  • 'Mysql command':使用mysql -u usename -ppassword -e <Create table tablename> <fixed columns>
  • '數據加載器':使用mysql -u usename -ppassword -e LOAD DATA INFILE ...將csv加載到新創建的表中。

我知道我有點偏離主題仍暗示該選項,因爲

  • 數據加載器是非常 - 非常快速和容易獲得的。
  • 它會解決你的數據加載問題,這必須在表創建後完成。
  • 您無需將DDL permission添加到您的應用程序代碼中。如果您的代碼進入infinite loop或類似的問題可能會發生問題。
  • 問題將propagate to DB也影響其他連接的應用程序(如果有)。
  • 如果你是一個Web應用程序或similiar,SQL-InjectionHUGE CONCERN爲你的方法。

如果您使用的任何其他資料庫,請在similiar線工作。