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

时间:2011-04-28 15:28:14

标签: java sql jdbc logic oracle11g

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

(getPrimaryKey是一个查询元数据表以获取表的PK的简单方法.row是一个包含列名作为键的linkedhashmap - 值中有其他信息,但它没有关联)

以下是构造的更新语句的示例:

UPDATE BOOKS SET BOOK_ID=?, TITLE=?, AUTHOR_LAST_NAME=?, AUTHOR_FIRST_NAME=?, RATING=? WHERE BOOK_ID=?

所以这一切都很好。我的问题是我实际上无法使值与正确的列正确配对。换句话说,更改以下列方式存储在列表中:

(primarykey1value,primarykey2value,...,column1value,column2value,...,columnnvalue)

但查询设置为:

(第1栏,第2栏,第3栏,......,主键1,主键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”错误。但我对如何进行感到茫然。

无论如何,任何帮助都会受到赞赏 - 正如我的手柄建议,我是所有这一切的新手。很抱歉这篇文章很长,但希望完整的问题长度有帮助。

1 个答案:

答案 0 :(得分:0)

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