2012-07-05 2 views
0

Это мой код. Проблема заключается в том, что он вставляет в базу данных на основе количества строк в цикле вместо того, чтобы вставлять только один раз. Как показывает код, он получает количество строк из файла и пытается извлечь некоторую информацию для хранения в базе данных. Например, если строка имеет 5 строк, она хранит эту информацию 5 раз в базе данных.Мне нужно его вставить в базу данных только один раз

import java.io.File; 
import java.io.IOException; 
import java.sql.*; 
import java.util.List; 
import org.apache.commons.io.FileUtils; 

public class Movie_Info { 

    private static String user = "root"; 
    private static String pw = ""; 
    private static String dbUrl = "jdbc:mysql://127.0.0.1/NLD"; 
    private static String dbClass = "com.mysql.jdbc.Driver"; 

    public static String scraped_commentsInsert 
     = "INSERT INTO scraped_comments (id, movie_title,user_comments) VALUES (?,?,?)"; 

    private Connection con; 
    private Statement st; 
    private PreparedStatement multiInsert; 

    public Movie_Info(String id, String movie) throws IOException, SQLException{ 

     try { 
      Class.forName(dbClass); 
      con = DriverManager.getConnection(dbUrl, user, pw); 
      //con.setAutoCommit(false); 
      st=con.createStatement(); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      return; 
     } 

     List lines = null; 

     try{ 
      lines = FileUtils.readLines(new File(movie+"_S1.txt"), "UTF-8"); 
     } catch(Exception ex) { 
      System.out.println("movie file does not exist: " + movie + " id: " + id); 
      return; 
     } 


     for (Object line : lines) { 
      String Synopsis = line.toString(); 
      String Released = line.toString(); 
      String Runtime = line.toString(); 
      String Genre = line.toString(); 
      String Director = line.toString(); 
      String Actors = line.toString(); 

      if (String.valueOf(line).startsWith("Synopsis ")) { 
       // for quotes 
       Synopsis = Synopsis.replace(":", " storyline goes like this. "); 
       Synopsis = Synopsis.replace("'", " "); 
       // remove comment 
       Synopsis = Synopsis.replace("Synopsis ", ""); 
       System.out.println(Synopsis); 
      } 

      if (String.valueOf(line).startsWith("Released: ")) { 
       Released = Released.replace("'", "''"); 
       Released = Released.replace("Released: ", ""); 
       System.out.println(Released); 
      } 

      if (String.valueOf(line).startsWith("Runtime: ")) { 
       Runtime = Runtime.replace("'", "''"); 
       Runtime = Runtime.replace("Runtime: ", ""); 
       System.out.println(Runtime); 
      } 

      if (String.valueOf(line).startsWith("Genres: ")) { 
       Genre = Genre.replace("'", "''"); 
       Genre = Genre.replace("Genre: ", ""); 
       System.out.println(Genre); 
      } 

      if (String.valueOf(line).startsWith("Director: ")) { 
       Director = Director.replace("'", "''"); 
       Director = Director.replace("Director: ", ""); 
       System.out.println(Director); 
      } 

      if (String.valueOf(line).startsWith("Actors: ")) { 
       Actors = Actors.replace("'", " "); 
       Actors = Actors.replace("Actors: ", ""); 
       System.out.println(Actors); 
      } // end if 

      // int k= st.executeUpdate("INSERT INTO Movie_Infor (Release_Date,movie_title,Synopsis, Runtime, Genres, Director, Actors) values('"+Released+"','"+movie+"','"+Synopsis+"','"+Runtime+"','"+Genre+"','"+Director+"','"+Actors+"')"); 
     } // end for 

     con.close(); 
    } 
} 
+0

что вы reaaly хотите? вставить один или пять раз? – pinkdawn

+0

Попробуйте сузить свой код до небольшой, соответствующей части. Трудно и трудоемко читать весь ваш исходный код - более компактный пример даст вам больше ответов. –

+1

Я думаю, у вас есть файл, в котором есть 6 строк. Это информация о синопсисе, выпуске, времени выполнения, жанре, режиссере и актерах. Вы хотите сохранить их как одну запись в таблицу. Я прав ? – Sabbath

ответ

1

Во-первых, пожалуйста, попробуйте опубликовать краткое пример кода ... весь класс на самом деле не было необходимости.

Проблема с вашим для цикла:

for (Object line : lines) { 
    String Synopsis = line.toString(); 
    String Released = line.toString(); 
    String Runtime = line.toString(); 
    String Genre = line.toString(); 
    String Director = line.toString(); 
    String Actors = line.toString(); 
    ... 
} 

Здесь вы присваиваете значение типа String в одной линии для каждой из переменных синопсис, Release, и т.д. Так как вы, кажется, считывая эти строки из файла, а затем не зная, как выглядят ваши данные - например. что выглядит строка line - я не могу предложить способ извлечь нужную вам информацию.

Причина, по которой вы вставляя то же самое, несколько раз в базу данных, потому что строки:

st.executeUpdate("INSERT INTO Movie_Infor (Release_Date,movie_title,Synopsis, Runtime, Genres, Director, Actors) values('"+Released+"','"+movie+"','"+Synopsis+"','"+Runtime+"','"+Genre+"','"+Director+"','"+Actors+"')"); 

входит внутри в ваш цикл. (Я предполагаю, что вы не прокомментировали это в своей реальной программе, если он действительно прокомментирован, то я не понимаю, как что-то вставляется в вашу базу данных вообще.) В любом случае, если вы переместите эту строку из цикла for, вы должны вставить его только один раз.

Наконец, в соответствии с условными стандартами Java-кодировки вы должны указать переменные, начинающиеся с нижнего регистра. Итак, вместо String Synopsis у вас должно быть String synopsis и т. Д.

+1

В дополнение к тому, что вы упомянули, если он захочет вставить несколько фильмов ... Вещи ... По запросу он может использовать следующий метод : 'INSERT INTO

( [, [, ...] ]) ЦЕННОСТИ ( [, [, ...]]) [, <повторить последний блок> [, ...]] ' – Zoey

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