有谁知道我可以在 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/