java - JDBC 问题 : not being able to correctly bind variables and values (shortened)

标签 java sql jdbc logic oracle11g

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

(getPrimaryKey 是一个简单的方法,用于查询元数据表以获取表的 PK。row 是一个包含列名作为键的 linkedhashmap - value 中还有其他信息,但不相关)

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

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

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

(主键 1 值,主键 2 值,...,列 1 值,列 2 值,...,列值)

但查询设置为:

(第 1 列,第 2 列,第 3 列,...,主键 1,主键 2 ...)

因此,如果我只编写一个 for 循环来运行查询,那么我最终将按如下方式绑定(bind)值:

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),那么您将需要通过索引或名称/值对来唯一地映射它们。

关于java - JDBC 问题 : not being able to correctly bind variables and values (shortened),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5821074/

相关文章:

java - Eclipse 无法定位文件 - File 对象使用上出现 FileNotFoundException

java - 如何使用正则表达式解析出sql中的所有列?

python - 如何查询SQLAlchemy中的关联表?

java - 以 DB2 作为后端的 jsp 分页

java - 如何仅在给定已实现的方法的情况下创建队列?

javascript - 如何在where子句中使用$_Post id形式从sql中获取数据

mysql - 如何按质量得分和发布日期对文章进行排序?

java - MS Access - 无法打开更多表

java - JDBC:将日期值插入 MySQL

java - 使用 JDBC 的简单客户端中间件模拟