【问题标题】:update database based on user input in java基于java中的用户输入更新数据库
【发布时间】:2020-03-02 14:43:34
【问题描述】:

我是一个新程序员,我被赋予了创建一个 Subject.java 类的任务,它会在其中询问学生他们正在学习多少科目,然后将科目信息存储到数据库中,但是我当前代码的问题是数据库中只更新了一行。我的代码如下,请帮助我。


                System.out.print("\nEnter number of subject: ");
                int sub = in.nextInt();
                int i=0;

                for (i=0; i<sub; i++)
                {
                    System.out.print("\nCode: ");
                    this.setCode(in.next());

                    System.out.print("\nName: ");
                    this.setName(in.next());

                    System.out.print("\nCredit: ");
                    this.setCredit(in.nextInt());

                // insert into database
                ResultSet rs = null;
                String sqlInsert = "INSERT INTO subject (code, name, credit) VALUES (?,?,?)";

                try (Connection conn = MySQLDB.getConnection(); 
                    PreparedStatement pstmt
                        = conn.prepareStatement(sqlInsert);)
                {  

                    // assign parameters for statement
                        pstmt.setString(1, this.getCode());
                        pstmt.setString(2, this.getName());
                        pstmt.setInt (3, this.getCredit());

                        pstmt.addBatch();


                    if (pstmt.executeUpdate() == 1) 
                    {
                        System.out.println("\nNew subject has been created succesfully!");
                    } 
                    else 
                    {
                        System.out.println("\nError");
                    }


                } 

                catch (SQLException ex) 
                {
                    System.out.println(ex.getMessage());
                } 

【问题讨论】:

  • 至少,您可能不应该为每一行关闭Connection,您应该在循环之前打开它并重复使用它来插入每一行,然后一起执行更新。
  • 我不明白 ????
  • 您对每一行 执行try (Connection conn = MySQLDB.getConnection();。这将连接到数据库并每次关闭它,因此要更新 100 行,您将连接到数据库 100 次并关闭它 100 次。要么就是你放错了},它不像这里出现的那样在你的for循环中。发布完整的方法。
  • 为了帮助自己编程和调试,我建议你重构你的代码,遵循每个方法应该负责一个任务的原则。因此,在您的情况下,我建议您使用一种方法来运行并收集用户输入。一旦收集到这些(例如,在 ArrayList 中),然后运行这些输入并将它们添加到批处理中以进行插入。这将帮助您更轻松地缩小调试会话期间出现的问题。

标签: java database jdbc


【解决方案1】:

正如Nexevis 所说,您需要将Connection 代码放在for-loop 之外,如下所示:

// insert into database
 ResultSet rs = null;
 String sqlInsert = "INSERT INTO subject (code, name, credit) VALUES (?,?,?)";

 System.out.print("\nEnter number of subject: ");
 int sub = in.nextInt();
 int i = 0;
 try {

     Connection conn = MySQLDB.getConnection();
     PreparedStatement pstmt
         = conn.prepareStatement(sqlInsert);

     for (i = 0; i < sub; i++) {
         System.out.print("\nCode: ");
         this.setCode( in.next());

         System.out.print("\nName: ");
         this.setName( in.next());

         System.out.print("\nCredit: ");
         this.setCredit( in.nextInt());

         // assign parameters for statement
         pstmt.setString(1, this.getCode());
         pstmt.setString(2, this.getName());
         pstmt.setInt(3, this.getCredit());
         pstmt.addBatch();
     }
     try {
         // execute it to insert the data
         pstmt.executeBatch();
     } catch (SQLException e) {
         System.out.println("Error message: " + e.getMessage());
         return; // Exit if there was an error
     }
      pstmt.close(); 
      conn.close();
    } catch (SQLException ex) {
     System.out.println(ex.getMessage());
 }

【讨论】:

  • 虽然Connection 应该在for 循环之外,但您仍然应该像OP 一样使用try-with 资源。这是确保连接正确关闭且易于阅读的更好方法。
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多