#java #sql #jdbc #logic #oracle11g
#java #sql #jdbc #Логические #oracle11g
Вопрос:
Я работаю над проектом, который можно описать следующим образом: пользователь передаст имя таблицы и некоторые критерии. Затем программа извлекает таблицу из Oracle и отображает результаты пользователю. Затем у пользователя будет возможность изменить ячейки в строке, сохранить изменения и отправить их обратно в Oracle. Сейчас я пишу «generalDAO», который выполняет все эти действия и работает для любой переданной таблицы. (Одна из причин, по которой мы пытаемся сделать это в общих настройках, заключается в том, что у нас есть более 50 таблиц для работы.) В любом случае, я могу делать все, кроме правильной привязки переменных к обновленным значениям. Я думаю, что я ошибаюсь в логике этого. Если у кого-то есть время и терпение, чтобы разобраться с этим, я был бы признателен за любую помощь или предложения. Чтобы конкретизировать это, давайте предположим, что таблица, с которой я работаю, называется «КНИГИ» и содержит следующие столбцы: book_id (также PK), title, author_last_name, author_first_name и rating.
(getPrimaryKey — это простой метод, который запрашивает таблицу метаданных для PK таблицы. строка — это linkedhashmap, которая содержит имена столбцов в качестве ключей — в значении есть другая информация, но она не связана)
Вот пример инструкции update, которая создается:
UPDATE BOOKS SET BOOK_ID=?, TITLE=?, AUTHOR_LAST_NAME=?, AUTHOR_FIRST_NAME=?, RATING=? WHERE BOOK_ID=?
Так что все хорошо. Моя проблема в том, что я не могу на самом деле правильно связать значения с правильными столбцами. Одним словом, изменения сохраняются в списке следующим образом:
(primarykey1value, primarykey2value, …, column1value, column2value, …,columnnvalue)
но запрос настроен как:
(столбец 1, столбец 2, столбец 3, …, primarykey1, primarykey2 …)
Итак, если я просто напишу цикл for для выполнения запроса, то в конечном итоге я свяжу значения следующим образом:
UPDATE BOOKS SET BOOK_ID=primarykey1value, TITLE=primarykey2value, AUTHOR_LAST_NAME=?, AUTHOR_FIRST_NAME=?, RATING=? WHERE BOOK_ID=?
И так далее. Короче говоря, проблема в том, что сопряжение неверно.
Вот мой код:
public void update(String tableName, List dataList){
LinkedHashMap primaryKeyMap=getPrimaryKey(tableName);
Iterator itr=dataList.iterator();
Connection conn=null;
PreparedStatement ps=null;
try {
conn=ConnectionHelper.getConnection();
conn.setAutoCommit(false);
LinkedHashMap row=null;
while(itr.hasNext()){
row=(LinkedHashMap)itr.next();
SQLVO vo=makeUpdate(tableName, primaryKeyMap, row);
String sql=vo.getSql();
int totalCount=vo.getColCount() vo.getPkCount();
int upperBd=totalCount-vo.getPkCount() 1;
int colBd=vo.getColCount();
ps=conn.prepareStatement(sql);
Iterator iter=row.entrySet().iterator();
//if("Y".equals(checker)){
for(int i=upperBd; i <=totalCount; i ){
Map.Entry pairs=(Map.Entry)iter.next();
ps.setString(i, (String)pairs.getValue());
System.out.println(" This is the associated value: " pairs.getValue()); //
}
for(int i=1; i<=colBd; i ){
Map.Entry pairs=(Map.Entry)iter.next();
ps.setString(i, (String)pairs.getValue());
}
ps.addBatch();
//}
}
int updateCounts[]=ps.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
DAOException daoe = new DAOException(e.getMessage());
throw daoe;
} finally {
ConnectionHelper.close(conn);
}
}
Есть ли у кого-нибудь опыт решения проблем такого типа? Два цикла for явно неверны, и я получаю ошибки «NoSuchElementException». Но я в недоумении, как поступить.
В любом случае, любая помощь была бы оценена — как подсказывает мой дескриптор, я новичок во всем этом. Извините, что сделал этот пост таким длинным, но, надеюсь, поможет полная длина вопроса.
Ответ №1:
Если значения должны использоваться в разных емкостях (иначе значение против PK), то вам нужно будет однозначно сопоставить их либо по индексу, либо в виде пары имя / значение.