Разбор таблицы Excel в базу данных в Java - проблема с передачей аргументов - PullRequest
0 голосов
/ 24 декабря 2018

Я читаю данные из таблицы Excel и использую Java, пытаясь установить эти значения в базу данных.Моя таблица Excel имеет 6 столбцов и 170 строк.Я сделал класс ExcelDataModel и mathod, в котором я прохожу таблицу Excell, но теперь я застрял на том, как передать аргументы в BatchPreparedStatement.Это мой код:

@Override
public void getExcell2() {
     final String PATH = "C:\\Workspace\\zaposlenici.xlsx";         
     try {
        Workbook workbook = WorkbookFactory.create(new File(PATH));             
        Sheet sh = workbook.getSheetAt(0);                                              
        Iterator<Row> rowIterator = sh.iterator();              
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();                                               
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                //how to pass arguments from one row to preparedStatement?

                jdbcTemplate.batchUpdate("INSERT INTO INS_RAZNO.ZAPOSLENICI_TEST VALUES (?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
                    @Override                                   
                    public void setValues(PreparedStatement ps, int i) throws SQLException {
                        ExcelDataModel ex = new ExcelDataModel();
                        ps.setString(1, ex.getIme());
                        ps.setString(2, ex.getPrezime());           
                        ps.setString(3, ex.getOdjel());     
                        ps.setString(4, ex.getSlozenostPosla());            
                        ps.setString(5, ex.getStarost());       
                        ps.setString(6, ex.getMjesecniOD());    
                    }
                    @Override
                    public int getBatchSize() {
                        return 0;       
                    }
                });

             }}


        } catch (EncryptedDocumentException | InvalidFormatException | IOException e) {
        e.printStackTrace();
        }
     }

А вот мой код ExcelDataModel:

public class ExcelDataModel {

private String ime;
private String prezime;
private String odjel;
private String slozenostPosla;
private String starost;
private String mjesecniOD;

public String getIme() {
    return ime;
}

public void setIme(String ime) {
    this.ime = ime;
}

public String getPrezime() {
    return prezime;
}

public void setPrezime(String prezime) {
    this.prezime = prezime;
}

public String getOdjel() {
    return odjel;
}

public void setOdjel(String odjel) {
    this.odjel = odjel;
}

public String getSlozenostPosla() {
    return slozenostPosla;
}

public void setSlozenostPosla(String slozenostPosla) {
    this.slozenostPosla = slozenostPosla;
}

public String getStarost() {
    return starost;
}

public void setStarost(String starost) {
    this.starost = starost;
}

public String getMjesecniOD() {
    return mjesecniOD;
}

public void setMjesecniOD(String mjesecniOD) {
    this.mjesecniOD = mjesecniOD;
}

}

Я не знаю, как передать эти аргументы в readyStatement.В основном, как сформировать данные, чтобы они стали аргументами?Есть идеи?Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Прежде всего, давайте разберемся с функционированием BatchPreparedStatementSetter, оно содержит два метода:

getBatchSize (): определит количество записей, которые будут повторяться в методе setValues,index будет передан в качестве второго аргумента.

setValues ​​(java.sql.PreparedStatement ps, int i): будет повторяться число раз, определенное в методе getBatchSize ().

Так в чем смысл этого, вы можете получить доступ к элементам вашей коллекции, используя индекс, как в примере ниже:

jdbcTemplate.batchUpdate("INSERT INTO INS_RAZNO.ZAPOSLENICI_TEST VALUES (?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
     @Override                                   
     public void setValues(PreparedStatement ps, int i) throws SQLException {
         ps.setString(1, sh.getCell(i,1)); // Iterating over row, getting the first cell
     }
     @Override
     public int getBatchSize() {
         return sheet.getPhysicalNumberOfRows(); // Total rows in the Excel for example
     }
 });

PS: я использовал Apache POI Documentation, чтобы предложить методы для использования

Документация BatchPreparedStatementSetter

0 голосов
/ 24 декабря 2018

Вы должны выбрать один из двух вариантов:

  • Вызовите обновление в цикле итерации ячейки и используйте функцию обновления JdbcTemplate # вместо batchUpdate.
  • Если вы хотите batchUpdate, то сначала вы выполняете итерациюExcel клетки, собирать данные в список.И тогда вне цикла вы можете использовать JdbcTemplate # batchUpdate.

, но не оба одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...