Вопрос JDBC: невозможность корректно привязать переменные и значения (сокращено)

#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), то вам нужно будет однозначно сопоставить их либо по индексу, либо в виде пары имя / значение.