2015-09-11 9 views
0

в моем текущем проекте Я использую базу данных H2 для хранения данных из JTable (точнее данных TableModel).Извлечь данные из базы данных H2 эффективно

Я написал код, чтобы сохранить все столбцы из моей таблицы, и теперь я хочу снова получить данные (загрузка из базы данных).

Пока все хорошо, но я не могу найти хороший способ извлечения данных из базы данных и отполировать его для добавления в таблицу. У меня есть метод для моей таблицы, чтобы добавить новую строку с данными для всех столбцов, поэтому это не проблема (что-то вроде public void addRow(Object dataForFirstCol, Object dataForSecondCol [...]), но мне нужно получить данные по строкам. Как это возможно с H2/Java SQL?

Я нашел, что ResultSet будет полезен для этого, но мне все еще нужно получать данные по строкам через SQL, а что-то вроде SELECT * FROM SOMEDATABASE не поможет.

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

EDIT: Это код, который я использую для создания базы данных, а также для ее сохранения. Однако запрос «DROP» предназначен только для тестирования.

/** 
* Save tables content into H2 database 
* @param filename of the database 
* @param table to get the contents from 
*/ 
public void save(File filename, JTable table) { 

    // prevent saving when user is editing a cell 
    if (table.isEditing()) { 
     table.getCellEditor().stopCellEditing(); 
    } 

    try { 
     Class.forName("org.h2.Driver"); 
     System.out.println(filename.toString()); 
     Connection conn = DriverManager.getConnection("jdbc:h2:" + filename.toString(), "sa", ""); 
     Statement state = conn.createStatement(); 

     state.execute("DROP TABLE IF EXISTS TASKS"); 

     state.execute("CREATE TABLE TASKS (" 
       + "SeqNumber INT PRIMARY KEY," 
       + "FBNumber INT," 
       + "ReportNumber INT," 
       + "BetraNumber INT," 
       + "Date varchar(255)," 
       + "StationName varchar(255)," 
       + "Kilometrage varchar(255)," 
       + "BlockTime varchar(255)," 
       + "WorkTime INT," 
       + "Worker varchar(255)," 
       + "Task varchar(255)," 
       + "Comments varchar(255)," 
       + "ClosedState BOOLEAN," + ")" 
       ); 

     String sqlInsert = "INSERT INTO TASKS " 

       + "(SeqNumber, " 
       + "FBNumber, " 
       + "ReportNumber, " 
       + "BetraNumber, " 
       + "Date, " 
       + "StationName, " 
       + "Kilometrage, " 
       + "BlockTime, " 
       + "WorkTime, " 
       + "Worker, " 
       + "Task, " 
       + "Comments, " 
       + "ClosedState) " 

     + "VALUES" 
     + "(?" // SeqNumber 
     + ",?" // FBNumber 
     + ",?" // ReportNumber 
     + ",?" // BetraNumber 
     + ",?" // Date 
     + ",?" // StationName 
     + ",?" // Kilometrage 
     + ",?" // BlockTime 
     + ",?" // WorkTime 
     + ",?" // Worker 
     + ",?" // Task 
     + ",?" // Comments 
     + ",?)"; // ClosedState 

     for (int rowIndex = 0; rowIndex < table.getModel().getRowCount(); rowIndex++) { 

      PreparedStatement sqlState = conn.prepareStatement(sqlInsert); 

      sqlState.setInt(COLUMN_SEQ_NUMBER, getSeqNumber(table, rowIndex)); 
      sqlState.setInt(COLUMN_FB_NUMBER, getFBNumber(table, rowIndex)); 
      sqlState.setInt(COLUMN_REPORT_NUMBER, getRepNumber(table, rowIndex)); 
      sqlState.setInt(COLUMN_BETRA_NUMBER, getBetraNumber(table, rowIndex)); 

      sqlState.setString(COLUMN_DATE, getDate(table, rowIndex)); 
      sqlState.setString(COLUMN_STATION_NAME, getStationName(table, rowIndex)); 
      sqlState.setString(COLUMN_KILOMETRAGE, getKilometrage(table, rowIndex)); 
      sqlState.setString(COLUMN_BLOCK_TIME, getBlockTime(table, rowIndex)); 

      sqlState.setInt(COLUMN_WORK_TIME, getWorkTime(table, rowIndex)); 

      sqlState.setString(COLUMN_WORKER, getWorker(table, rowIndex)); 
      sqlState.setString(COLUMN_TASK, getTask(table, rowIndex)); 
      sqlState.setString(COLUMN_COMMENTS, getComments(table, rowIndex)); 
      sqlState.setBoolean(COLUMN_CLOSED_STATE, getClosedState(table, rowIndex)); 

      sqlState.executeUpdate(); 
     } 

     // This is also just temporary code to see the contents 
     ResultSet dbContent = conn.createStatement().executeQuery("SELECT * FROM TASKS"); 
     while(dbContent.next()) { 
      for (int i = 1; i+1 < DBDatabaseSystem.table.getColumnCount(); i++) { 
       System.out.println(dbContent.getString(i)); 
      } 
     } 

     conn.close(); 
     unsavedChanges = false; 

    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     DBDatabaseSystem.infoSystem.addError("Es gab ein SQL Problem beim Speichern der Datenbank"); 
    } 


} 
+1

Почему вы говорите, что «ВЫБЕРИТЕ * ИЗ БОЛЬШЕ?» Вам не поможет?Как создается таблица базы данных? – RealSkeptic

+0

Ох ошибся там '' 'SELECT * FROM SOMEDATABASE''' – Flatron

+0

В настоящее время все мои данные хранятся в одной базе данных с одной таблицей. – Flatron

ответ

0

Вы спрашиваете о retrive в JTable и включают в себя код для save и простой печати.

Вот некоторые теоретические идеи:

  • Отображение GUI данные из базы данных может означать множество строк. Графический интерфейс (swing Jtable, SWT Table, web и т. Д.) Отображает до 100 строк при запуске. Я думаю, что вы должны поставить эти строки в начале.
  • Интерфейс public interface TableModel для получения ленивых или динамических или подкачки (такое слово присутствует в сети), к сожалению официальная поддержка/реализация неизвестна (мне). Google показывает несколько, я не знаю, хороши они или плохи.
  • почти все impelmentation должны сделать select count(*) from ... для реализации getRowCount(); затем получить данные с norportable п SQL, в Н2 читать об этом синтаксисе select * ... LIMIT OFFSET, чтобы получить конкретные строки. Вопрос не так ясен, но, вероятно, вы знаете об этой идее?

РЕДАКТИРОВАТЬ: часть над размером около вертикального размера (этот вопрос для меня затруднен, я не являюсь носителем английского языка). Если вы думаете о горизонтальном измерении, обычно я получаю все объекты (столбцы) одной строки из строки ResulSet до Map<String,Object>

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