繁体   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