Я использую apache Poi для извлечения данных из листа Excel, загруженного на сервер. Цель состоит в том, чтобы получить данные Excel, которые имеют четыре столбца (clientId, clientName, monthMinimum, setUpFee), и обновить ежемесячную минимальную сумму существующей строки и плату за установку, основанную на clientId, в существующей таблице базы данных с именем client. У меня есть этот код в другом разделе моего проекта для вставки нового клиента, и он работает, но я изо всех сил пытаюсь заставить его обновить существующий. Может кто-нибудь сказать мне, что я делаю не так с clientId, где он не обновляет эти два поля?
@RequestMapping(value="/save/acctDocument")
public String addAcctDoc(Model model, @ModelAttribute(value="newDocument") Document newDocument, @RequestParam("document") MultipartFile file) throws IOException{
// Document doc=documentRepository.save(newDocument);
newDocument.setStorage(storageService.storer(file)); //uploads the doc
//find doc, read doc, save info to db client table
int batchSize = 20;
Connection connection = null;
try {
long start = System.currentTimeMillis();
FileInputStream inputStream = new FileInputStream(appDir+"\\AcctUploadFile.xlsx");
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet firstSheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = firstSheet.iterator();
connection = DriverManager.getConnection(jbdcUrl, dbusername, dbpassword);
connection.setAutoCommit(false);
String sql = "UPDATE client SET (monthlyMinimum, oliSetUpFee) VALUES (?, ?) WHERE clientId = (?)";
PreparedStatement statement = connection.prepareStatement(sql);
int count = 0;
rowIterator.next(); // skip the header row
while (rowIterator.hasNext()) {
Row nextRow = rowIterator.next();
Iterator<Cell> cellIterator = nextRow.cellIterator();
while (cellIterator.hasNext()) {
Cell nextCell = cellIterator.next();
int columnIndex = nextCell.getColumnIndex();
switch (columnIndex) {
case 1:
long clientId = (long) nextCell.getNumericCellValue();
statement.setLong(3, clientId);
break;
case 2:
float monthlyMinimum = (float) nextCell.getNumericCellValue();
statement.setFloat(1, monthlyMinimum);
break;
case 3:
float setUpFee= (float) nextCell.getNumericCellValue();
statement.setFloat(2, setUpFee);
break;
}
}
statement.addBatch();
if (count % batchSize == 0) {
statement.executeBatch();
}
}
workbook.close();
// execute the remaining queries
statement.executeBatch();
connection.commit();
connection.close();
File acctUploadFile = new File(appDir+"\\AcctUploadFile.xlsx");
acctUploadFile.delete();
long end = System.currentTimeMillis();
System.out.printf("Import done in %d ms\n", (end - start));
} catch (IOException ex1) {
System.out.println("Error reading file");
ex1.printStackTrace();
} catch (SQLException ex2) {
System.out.println("Database error");
ex2.printStackTrace();
}
return "redirect:/reports/";
}
}
Обновление: я обновил код, чтобы включить мудрость из одного из комментариев, но он все еще не совсем работает. Я застреваю в операторе if для счетного модуля. Это ошибка базы данных, которую она выдает: java. sql .BatchUpdateException: неправильный синтаксис рядом с '('.