![JAR search and dependency download from the Maven repository](/logo.png)
net.dongliu.dbutils.ResultSets Maven / Gradle / Ivy
package net.dongliu.dbutils;
import net.dongliu.dbutils.utils.Exceptions;
import net.dongliu.dbutils.utils.Closeables;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.NoSuchElementException;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
/**
* @author Liu Dong
*/
public class ResultSets {
/**
* Wrap resultSet as iterator. You need consume all items or close this iterator manually
*/
public static CloseableIterator asIterator(ResultSet resultSet, RowMapper processor,
AutoCloseable... closeables) {
return new ResultSetIterator<>(resultSet, processor, closeables);
}
/**
* Wrap resultSet as stream. You need consume all items or close this stream manually
*/
public static Stream asStream(ResultSet resultSet, RowMapper processor,
AutoCloseable... closeables) {
CloseableIterator closeableIterator = asIterator(resultSet, processor, closeables);
Spliterator spliterator = Spliterators.spliteratorUnknownSize(
closeableIterator, 0);
Stream stream = StreamSupport.stream(spliterator, false);
return stream.onClose(() -> Closeables.closeQuietly(closeableIterator));
}
/**
* Wrap jdbc result set as iterator
*/
private static class ResultSetIterator implements CloseableIterator {
private final ResultSet resultSet;
private final RowMapper processor;
private final AutoCloseable[] autoCloseables;
int row = 0;
boolean hasNext;
boolean remain;
boolean closed;
public ResultSetIterator(ResultSet resultSet, RowMapper processor,
AutoCloseable[] autoCloseables) {
this.resultSet = resultSet;
this.processor = processor;
this.autoCloseables = autoCloseables;
}
@Override
public boolean hasNext() {
if (!remain) {
inspectNext();
}
return hasNext;
}
public void inspectNext() {
try {
hasNext = resultSet.next();
if (!hasNext) {
close();
}
remain = true;
} catch (SQLException e) {
throw Exceptions.sneakyThrow(e);
}
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
row++;
try {
T value = processor.convert(resultSet, row);
remain = false;
return value;
} catch (SQLException e) {
throw Exceptions.sneakyThrow(e);
}
}
@Override
public void close() {
if (closed) {
return;
}
closed = true;
if (autoCloseables.length == 0) {
Closeables.closeQuietly(resultSet);
} else {
AutoCloseable[] array = new AutoCloseable[autoCloseables.length + 1];
array[0] = resultSet;
System.arraycopy(autoCloseables, 0, array, 1, autoCloseables.length);
Closeables.closeQuietly(array);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy