【问题标题】:Reading a File Into a Derby Database将文件读入 Derby 数据库
【发布时间】:2014-12-14 04:30:09
【问题描述】:

这是我将文本文件读入 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();}

        %>

【问题讨论】:

    标签: java database file derby


    【解决方案1】:

    您似乎在 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();
    

    之后,您应该清理并释放资源。最好的地方是在 finallytry 块中:

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

    一些进一步的考虑:

    如果你真的想使用纯 JSP,那么使用Front Controller pattern。所以每个请求都会发送到前端控制器 servlet。在那里,您决定执行哪种操作并为视图收集数据。最后转发给一个JSP来创建视图。在 JSP 中,您不应该使用任何 scriptlet。

    考虑使用像 StrutsSpring MVC 这样的 MVC 框架。但目前的标准是Java Server Faces,它更加基于组件。

    使用connection pool 进行数据库连接。

    使用logging 代替System.out.println()e.printStackTrace()

    要有效地将较大的文件插入数据库,请使用batch inserts

    【讨论】:

    • Vanj​​e,非常感谢您的详细解释。我将努力更改我的代码,以按照您的建议为代码包含一个单独的类。
    【解决方案2】:
    猜你喜欢
    • 2011-10-09
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多