有没有人知道我在Java和其他任何语言中可以找到关于SQL iterator / Operator的实现的好资源? 比你, -Nimesh
答案 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)的某些源代码?