All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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