SQL迭代器

时间:2009-04-24 22:09:31

标签: java sql iterator

有没有人知道我在Java和其他任何语言中可以找到关于SQL iterator / Operator的实现的好资源? 比你, -Nimesh

2 个答案:

答案 0 :(得分:1)

我将使用Elijah的解释,Nimesh实际上意味着,“是否有可能为ResultSet创建一个可重复的包装器。这是我掀起的东西。它显然还没有生产就绪,但它确实给了它因为没有标准(据我所知)ResultSetRow,它会为每一行返回一个Object []。

这个概念存在一些重大问题,尤其是Iterator不允许抛出,因此SQLExceptions被尽可能“现场”处理。此外,ResultSet是一个非常复杂和功能强大的野兽(例如,参见每种类型的重载方法)。这种复杂性可以部分地利用,但不是。例如,可能有像getIntIterable(ResultSet rs)这样的方法返回Iterable<int[]>。该方法可以检查ResultSetMetadata对象的getColumnType。这样,它可以在创建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.");
        }
    }
    };
}
}

答案 1 :(得分:0)

如何查看JDK或开源jdbc驱动程序(如mysql)的某些源代码?