Я работаю над проектом, который можно описать следующим образом: пользователь передаст имя таблицы и некоторые критерии.Затем программа извлечет таблицу из Oracle и покажет результаты пользователю.После этого пользователь получит возможность изменять ячейки подряд, сохранять изменения и отправлять их обратно в Oracle.Сейчас я пишу «generalDAO», который делает все эти вещи и работает для любой пройденной таблицы.(Одна из причин, по которой мы пытаемся сделать это в общих настройках, заключается в том, что у нас есть более 50 таблиц для работы.) В любом случае, я могу делать все, кроме правильного связывания переменных с обновленными значениями.Я думаю, что я облажался с логикой этого.Если у кого-то есть время и терпение, чтобы поработать над этим, я буду признателен за любую помощь или предложения.Чтобы сделать это конкретнее, давайте предположим, что таблица, с которой я работаю, называется «КНИГИ» и имеет следующие столбцы: book_id (также PK), title, author_last_name, author_first_name и rating.
(getPrimaryKeyэто простой метод, который запрашивает таблицу метаданных для PK таблицы. row - это связная хеш-карта, которая содержит имена столбцов в качестве ключей - в значении есть другая информация, но она не связана)
Вот примероператор обновления, который составлен:
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, primarykey 2 ...)
Так что, если я просто напишу цикл 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».Но я не знаю, как поступить.
В любом случае, любая помощь будет признательна - как подсказывает моя ручка, я новичок во всем этом.Извините за столь длительный пост, но, надеюсь, поможет полный вопрос.