JDBC问题:不能正确绑定变量和值(缩短)



我正在处理一个项目,可以这样描述:用户将传入一个表名和一些标准。然后,程序将从Oracle中检索一个表,并将结果显示给用户。然后,用户将有机会更改一行中的单元格,保存更改并将其发送回Oracle。现在我正在编写一个"generalDAO",它完成所有这些事情,并适用于任何传递的表。(我们尝试在一般设置中这样做的原因之一是我们有50多个表要处理。)无论如何,除了将变量正确绑定到更新的值之外,我可以做所有事情。我想我把逻辑搞砸了。如果有人有时间和耐心来解决这个问题,我会很感激任何帮助或建议。为了具体说明这一点,让我们假设我正在处理的表名为"BOOKS",并具有以下列:book_id(也是PK)、title、author_last_name、author_first_name和rating。

(getPrimaryKey)是查询元数据表中表的PK的简单方法。Row是一个包含列名作为键的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"错误。但我不知道该怎么做。

无论如何,任何帮助都会很感激-正如我的处理建议,我是一个新手所有这些。很抱歉让这篇文章这么长,但希望一个完整的问题长度有所帮助。

如果要以不同的容量使用这些值(即值与PK),则需要通过索引或作为名称/值对唯一地映射它们。

相关内容

  • 没有找到相关文章

最新更新