簡體   English   中英

將文件讀入Derby數據庫

[英]Reading a File Into a Derby Database

這是我最近一次嘗試將文本文件讀入Netbeans Derby數據庫的嘗試。 該文件包含5行,每行包含7個用逗號分隔的項目。 該程序運行沒有任何錯誤,但是數據庫根本沒有更新。 修復此代碼將對您有所幫助。

<% Connection connection = null;
PreparedStatement ps = null;

String urlanddatabasename = "jdbc:derby://localhost:1527/ProgramName

String userName = "root";
String password = "root";

Class.forName("org.apache.derby.jdbc.ClientDriver");
connection = DriverManager.getConnection(urlanddatabasename,userName,password);

try{
     String fileName = saveFile;
     File file = new File(fileName);
     Scanner inputStream = new Scanner(file);
     String[] array = new String[7];

     Statement statement = connection.createStatement();
     while(inputStream.hasNext()){//reads from the file until there are no items left
     String data = inputStream.next();
     array = data.split(",");
     String reportidString = array[0];

     String coursenameString = array[1];

     String tardiesString = array[2];

     String absencesString = array[3];

     String totalgradeString = array[4];

     String teachernameString = array[5];

     String schoolnameString = array[6];

     statement.executeUpdate("INSERT INTO report(reportid, coursename, tardies, absences, totalgrade, teachername, schoolname) values(reportidString, coursenameString,tardiesString, absencesString, totalgradeString, teachernameString, teachernameString, schoolnameString)");

                }
                inputStream.close();
            }catch(FileNotFoundException e){e.printStackTrace();}

        %>

看來您正在JSP scriptlet中使用此代碼。 這是非常糟糕的風格。 特別是對於與視圖表示沒有任何關系的代碼。

因此,您應該做的第一件事是創建一個普通的Java類並將該代碼放入其中。 然后,您將標記Class.forName()拋出一個檢查異常(ClassNotFoundException),而其他一些部分(如DriverManager.getConnection()connection.createStatement()statement.executeUpdate()拋出SQLException 您不應該讓servlet容器捕獲這些異常。

然后編寫一個簡單的main()方法來檢查您的代碼是否正常運行,甚至可以更好地進行JUnit測試。

您聲明了PreparedStatement變量,但從未使用過它。 相反,您后來使用了一個簡單的Statement 第一個更適合這里。 因此,使用類似這樣的內容:

ps = connection.prepareStatement("INSERT INTO "
     + "report(reportid, coursename, tardies, absences, totalgrade, teachername, schoolname) "
     + "values(?, ?, ?, ?, ?, ?, ?)");

使用? 作為實際值的占位符。

然后,您設置值。 請注意,准備好的語句索引從1開始。在執行所有SQL插入之后,應提交事務。 如果發生異常,請使用abort()

while(inputStream.hasNext()){//reads from the file until there are no items left
  // ...
  ps.setString(1, reportidString);
  ps.setString(2, coursenameString);
  // ...
  ps.executeUpdate();
}
connection.commit();

之后,您應該清理並釋放資源。 最好的地方是在try塊的finally

} finally {
  try {
    ps.close();
  } catch(SQLException e) {
    e.printStackTrace();
  }
  try {
    connection.close();
  } catch(SQLException e) {
    e.printStackTrace();
  }
}

一些進一步的考慮:

如果您真的想使用純JSP,請使用Front Controller模式 因此,每個請求都發送到前端控制器servlet。 在那里,您可以決定執行哪種操作並為視圖收集數據。 最后轉到JSP創建視圖。 在JSP內部,您不應使用任何腳本。

考慮使用諸如StrutsSpring MVC之類的MVC框架。 但是當前的標准是Java Server Faces ,它是基於組件的。

使用連接池進行數據庫連接。

使用日志記錄代替System.out.println()e.printStackTrace()

為了有效地將較大的文件插入數據庫,請使用批處理插入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM