java - SQL迭代器的实现

标签 java sql iterator

有谁知道我可以在 java 和任何其他语言中找到 SQL 迭代器/运算符的实现的好来源吗?

最佳答案

我会同意 Elijah 的解释,Nimesh 实际上的意思是,“是否有可能为 ResultSet 制作一个可迭代的包装器。这是我想出的东西。它显然还没有准备好生产,但它绝对提供了想法。由于没有标准(据我所知)ResultSetRow,它为每一行返回一个Object[]。

这个概念存在一些重大问题,尤其是迭代器不允许抛出,因此 SQLException 尽可能“现场”处理。此外,ResultSet 是一个非常复杂且功能丰富的野兽(例如,请参阅每种类型的重载方法)。这种复杂性可以被部分利用,但事实并非如此。例如,可能有类似 getIntIterable(ResultSet rs) 的方法。它返回 Iterable<int[]> 。该方法可以检查 getColumnType ResultSetMetadata 对象的 s。这样,它可以在创建 Iterable 之前抛出异常(例如,如果并非所有列都是整数),而 Iterable 的方法不能抛出异常。

public static class ResultSetIterable implements Iterable<Object[]>
{
private ResultSet rs;
private int columnCount;

public ResultSetIterable(ResultSet rs) throws SQLException
{
    this.rs = rs;
    columnCount = rs.getMetaData().getColumnCount();
}

public Iterator<Object[]> iterator()
{
    return new Iterator<Object[]>() 
    {
    private boolean moreRows;
    {
        try
        {
        moreRows = rs.first();
        }
        catch(SQLException e)
        {
        moreRows = false;
        }
    }

    public boolean hasNext()
    {
        boolean knownClosed = false;
        try
        {
        knownClosed = rs.isClosed();
        }
        catch(Throwable e)
        {
        // Ignore possible SQLException or AbstractMethodError or...
        }

        return !knownClosed && moreRows;
    }

    public Object[] next()
    {
        Object[] curRow = new Object[columnCount];
        for(int i = 1; i <= columnCount; i++)
        {
        try
        {
            curRow[i - 1] = rs.getObject(i);
        }
        catch(SQLException e)
        {
            curRow[i - 1] = null;
        }
        }
        try
        {
        moreRows = rs.next();
        }
        catch(SQLException e)
        {
        moreRows = false;
        }
        return curRow;
    }

    public void remove()
    {
        try
        {
        rs.previous();
        rs.deleteRow();
        }
        catch(SQLException e)
        {
        throw new UnsupportedOperationException("ResultSetIterable does not support remove for this ResultSet type.");
        }
    }
    };
}
}

关于java - SQL迭代器的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787756/

相关文章:

java - 在java构造函数中传递 “this”

Java 迭代器 hasNext() 方法始终为 false

java - Flink JDBC 连接 Multi-Tenancy

java - 如何跟踪 Java Web 应用程序中的连接池 - DBMS_APPLICATION_INFO

java - JSF 面板定位

mysql - mysql中的STR_TO_DATE解析

sql - 识别 MS Access 中文本字段中的数字

java - 当我使用 GROUP BY 组合值时,如何显示 SQL 表中的更改?

c++ - 如何删除列表中的 pair<int,int> 元素

java - 如何使用 .equals() 方法比较两个密码(创建密码和确认密码)?