[ 
https://issues.apache.org/jira/browse/DBUTILS-48?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12670809#action_12670809
 ] 

dfabulich edited comment on DBUTILS-48 at 2/5/09 8:30 AM:
-------------------------------------------------------------

Here's a patch to update DbUtils for 1.5.  It's backwards-compatible with the 
old API; in fact, most of my changes are type-erased at compile time.

The biggest change was to change the order of the QueryRunner.query method 
signatures (var-args have to go at the end).  The old functions are left in, 
but deprecated.

I also added a helper static method ResultSetIterator.iterable, which returns 
an Iterable, for use in for-each loops.  You'd use it like this:

{code}
for (Object[] row : ResultSetIterator.iterable(resultSet)) {
  // do stuff
}
{code}

      was (Author: dfabulich):
    Here's a patch to update DbUtils for 1.5.  It's backwards-compatible with 
the old API; in fact, most of my changes are type-erased at compile time.

The biggest change was to change the order of the QueryRunner.query method 
signatures (var-args have to go at the end).  The old functions are left in, 
but deprecated.

I also added a helper static method ResultSetIterator.iterable, which returns 
an Iterable, for use in for-each loops.  You'd use it like this:

for (Object[] row : ResultSetIterator.iterable(resultSet) {
  // do stuff
}
  
> Maintaining a parallel Java 1.5 version of DButils
> --------------------------------------------------
>
>                 Key: DBUTILS-48
>                 URL: https://issues.apache.org/jira/browse/DBUTILS-48
>             Project: Commons DbUtils
>          Issue Type: New Feature
>            Reporter: Olivier Grégoire
>            Priority: Minor
>             Fix For: 1.2
>
>         Attachments: generics.patch
>
>
> Well, DButils was a great step forward when managing a database. But Java 5 
> came and added a lot of new features to the language, including generics, 
> which I think is easy to put in place.
> The base change of all this is changing the signature of ResultSetHandler:
> public interface ResultSetHandler<T> {
>   public T handle(ResultSet rs) throws SQLException;
> }
> With this code, we can easily provide directly from the QueryRunner a 
> specific object without having to cast it.
> Furthermore, we can also make the queries much more efficient, and declare 
> only 2 method instead of three as it is currently the case:
>       public <T> T query(String sql, ResultSetHandler<T> handler, Object... 
> params) throws SQLException {
>               Connection connection = this.prepareConnection();
>               try {
>                       return this.query(connection, sql, handler, params);
>               } finally {
>                       close(connection);
>               }
>       }
>       public <T> T query(Connection connection, String sql, 
> ResultSetHandler<T> handler, Object... params) throws SQLException {
>               PreparedStatement statement = null;
>               ResultSet resultSet = null;
>               try {
>                       statement = this.prepareStatement(connection, sql);
>                       this.fillStatement(statement, params);
>                       resultSet = this.wrap(statement.executeQuery());
>                       return handler.handle(resultSet);
>               } catch (SQLException e) {
>                       throw this.nestException(e, sql, params); // 
> nestException creates an exception to be thrown here, instead of rethrow(e, 
> sql, params);
>               } finally {
>                       try {
>                               close(resultSet);
>                       } finally {
>                               close(statement);
>                       }
>               }
>       }
> I don't know for you, but I find that code much more readable and 
> maintainable. In fact, I already did this implementation and use it in prod 
> without any issue, since it is only basic language adaptation.
> And using it is also very easy:
> Book book = queryRunner.query("SELECT * FROM book WHERE title = ? AND author 
> = ?", new BeanHandler(Book.class), title, author);
> instead of 
> Book book = (Book)queryRunner.query("SELECT * FROM book WHERE title = ? AND 
> author = ?", new BeanHandler(Book.class), new Object[]{title, author});
> However, I wrote an original time estimation of 1 day, because all classes 
> have to be adapted, especially those included in 
> org.apache.common.dbutils.handlers.
> As I estimate, it is minor, it is just a request in order to have more 
> beautiful code, for a downside of providing a Java 1.5 compatible version of 
> DBUtils. Maintaining this should be very rough as well, since DBUtils is not 
> really big (but it's amazing how so little code can provide so much code 
> improvements!)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to