[英]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內部,您不應使用任何腳本。
考慮使用諸如Struts或Spring MVC之類的MVC框架。 但是當前的標准是Java Server Faces ,它是基於組件的。
使用連接池進行數據庫連接。
使用日志記錄代替System.out.println()
或e.printStackTrace()
為了有效地將較大的文件插入數據庫,請使用批處理插入 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.