2016-03-14 3 views
0

Мой код считывает данные из текстового файла для заполнения базы данных. Текстовый файл содержит 5 строк, включая пустую строку (строка 4). Код читает текстовый файл, но только вставляет последнюю строку в базу данных. Мне также нужен код для прочтения первой строки в текстовом файле.JDBC executeUpdate() вставляет только 1 строку

Любая помощь, в которой я пошла не так? Я новичок в программировании на Java.

Вот мой код:

import java.io.*; 
import java.sql.*; 

public class Example { 
    public static Connection getConnection() throws Exception { 
     String driver = "org.apache.derby.jdbc.ClientDriver"; 
     String url = "jdbc:derby://localhost:1527/Orders"; 
     String username = "user"; 
     String password = "password"; 

     Class.forName(driver); 
     Connection conn = DriverManager.getConnection(url, username, password); 
     return conn; 
    } 
    public static void main(String[] args)throws Exception { 

     String id =""; 
     String firstName =""; 
     String lastName =""; 
     String street=""; 
     String city =""; 
     String fileName = "src/Person.data"; 
     String line = null; 


     PreparedStatement pstmt = null; 
     Connection conn = null; 

     try { 
      FileReader fileReader = 
      new FileReader(fileName); 
      BufferedReader bufferedReader = 
      new BufferedReader(fileReader); 


      while((line = bufferedReader.readLine()) != null) { 

       if (line.trim().length() == 0) { 
        continue; // Skip blank lines 
       } 
       String[] splited = line.split(","); 
       //System.out.println(line); 
       id=splited[0]; 
       firstName=splited[1]; 
       lastName=splited[2]; 
       street=splited[3]; 
       city=splited[4]; 
       System.out.println(line); 
       System.out.println(splited[4]); 

       conn = getConnection(); 
       conn.setAutoCommit(false); 

       pstmt = conn.prepareStatement("insert into APP.Person(PERSON_ID, LAST_NAME, FIRST_NAME,STREET,CITY)values (?,?,?,?,?)");  
       pstmt.setString(1, id); 
       pstmt.setString(2, firstName); 
       pstmt.setString(3, lastName); 
       pstmt.setString(4, street); 
       pstmt.setString(5, city); 
       pstmt.executeUpdate(); 
       conn.commit(); 
      } 
      bufferedReader.close();  
     } 
     catch(FileNotFoundException ex) { 
      System.out.println(
       "Unable to open file '" + 
       fileName + "'"); 
     ex.printStackTrace(); 
     } 
     catch(IOException ex) { 
      System.out.println(
       "Error reading file '" 
       + fileName + "'");     
     } 

    } 
} 
+0

Форматирование кода. У вас есть строки, начинающиеся с случайных позиций и путающих фигурных скоб. – Kayaman

ответ

2

Это связано с введением только запускается на выполнение для последней записи. Лучший вариант - использовать executebatch. сначала добавьте все эти сценарии вставки в пакетном режиме, и после завершения цикла просто выполните эту партию.

Prepared statement is created inside the loop which is wrong. You need to create a Prepared statement out of the loop.

Использование попытка поймать блок следующим образом:

try { 
     FileReader fileReader = 
       new FileReader(fileName); 
     BufferedReader bufferedReader = 
       new BufferedReader(fileReader); 
     conn = getConnection(); 
      conn.setAutoCommit(false); 

      pstmt = conn.prepareStatement("insert into APP.Person(PERSON_ID, LAST_NAME, FIRST_NAME,STREET,CITY)values (?,?,?,?,?)"); 

     while((line = bufferedReader.readLine()) != null) { 

      if (line.trim().length() == 0) { 
       continue; // Skip blank lines 
      } 
      String[] splited = line.split(","); 
      //System.out.println(line); 
      id=splited[0]; 
      firstName=splited[1]; 
      lastName=splited[2]; 
      street=splited[3]; 
      city=splited[4]; 
      System.out.println(line); 
      System.out.println(splited[4]); 


      pstmt.setString(1, id); 
      pstmt.setString(2, firstName); 
      pstmt.setString(3, lastName); 
      pstmt.setString(4, street); 
      pstmt.setString(5, city); 
      pstmt.addBatch(); 

     } 
     pstmt.executeBatch(); 
     conn.commit(); 
     bufferedReader.close(); 
    } 
    catch(FileNotFoundException ex) { 
     System.out.println(
       "Unable to open file '" + 
         fileName + "'"); 
     ex.printStackTrace(); 
    } 
    catch(IOException ex) { 
     System.out.println(
       "Error reading file '" 
         + fileName + "'"); 
    } 
+0

Если вы хотите использовать пакетное выполнение, вам нужно заменить 'executeUpdate'' executeBatch', и вы должны перенести создание подготовленного оператора из цикла. –

+0

@MarkRotteveel true, я просто показывал ему путь. Обновлен код. Спасибо за предложение –

+0

@ Благодарю; Я переместил создание подготовленного оператора за пределы цикла и использовал executeBatch, я все еще получаю последнюю запись, вставленную в базу данных – Gokuh

Смежные вопросы