Robert, This seems like a fine addition to DbUtils. I'd love to see a PR on GitHub. Adding more documentation would be nice. WRT bringing this into DbUtils, can we avoid adding a new interface by using Java 8 default methods on QueryRunner? If DbUtils is not on Java 8, we can bring it up to Java 8.
Gary On Wed, Mar 6, 2019 at 1:05 PM Robert Huffman <[email protected]> wrote: > I like DbUtils QueryRunner, but the thing that has always bothered me is > that it forces me to read the entire ResultSet into memory rather than > allowing me to use cursors. So I developed a little library to do that, > which I called dbstream, which is on GitHub: > https://github.com/rhuffman/dbstream/ > > It provides an abstract StreamingResultSetHandler that will return a > Stream<T>, which each element is built from one row of the query. It > utilizes cursors by keeping the ResultSet (and underlying Connection) open > until the Stream is closed. There are three concrete subclasses of the > handler: > > - ArrayStreamingHandler: returns a Stream<Object[]>, where each Object[] > is the values from a row of the result > - ObjectStreamingHandler: returns a Stream<Object>, where each object is > a bean built from a row of the result > - MapStreamingHandler: returns a Stream<Map<String,Object>>, where each > object is a map of column names and values built from a row of the > result > > Of course, the QueryRunner.query methods close their database objects > before returning, so I needed different query methods to execute the query. > I extended QueryRunner to create StreamingQueryRunner with these two > methods: > > - public <T> Stream<T> queryAsStream( > String sql, > StreamingResultSetHandler<T> handler, > Object... args) > > - public <T> Stream<T> queryAsStream( > Connection connection, > String sql, > StreamingResultSetHandler<T> handler, > Object... args) > > > I'm probably going to publish it to Maven Central. However, would the > DbUtils developers be amenable to doing something like this directly in > DbUtils? I could integrate the work into DbUtils and give you a pull > request. It might take me a bit because I would have to convert the tests > from Spock, but it wouldn't be too bad. >
