Commons DbUtils
  1. Commons DbUtils
  2. DBUTILS-25

[dbutils] Proposal for a set of new ResultSetHandlers

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 1.0
    • Fix Version/s: 1.1
    • Labels:
      None
    • Environment:

      Operating System: All
      Platform: All

      Description

      Add set of ResultSetHandlers that return a Map instead of List.

      For each row, key is determined (default is first column, user can specify
      column index/name in constructor). Next the row is converted to scalar,
      Array, Map or bean and stored in the Map under key.

      object Array Map Bean
      ----------------- ---------------- -------------- ---------------
      ColumnMapHandler ArrayMapHandler MapMapHandler BeanListHandler

      Examples:

      String; sql = "select user_id, user_name, last_login from passwd";
      Map users = (Map)run.query(
      "select user_id, user_name from passwd",
      new ColumnMapHandler());
      System.out.println(users.get("usr007"));

      Map users = (Map)run.query(sql, new ArrayMapArray());
      System.out.println(users.get("usr007")[2]);

      Map users = (Map)run.query(sql, new MapMapArray());
      System.out.println(users.get("usr007").get("last_login"));

      Map users = (Map)run.query(sql, new MapBeanArray(TestBean.class));
      System.out.println(users.get("usr007").getLastLogin());

      Implementation note:
      Map implementation is LinkedHashMap. This class does preserve order of
      insertions, thus, the sorting can be done in sql. However this
      class is @since 1.4.

      Attached is source code (based on HEAD) and test cases.

        Activity

        Hide
        Piotr Lakomy added a comment -

        Created an attachment (id=12874)
        new source, patch to BaseTestCase.java

        Show
        Piotr Lakomy added a comment - Created an attachment (id=12874) new source, patch to BaseTestCase.java
        Hide
        Piotr Lakomy added a comment -

        Sorry, the attachement is a zip file.

        Show
        Piotr Lakomy added a comment - Sorry, the attachement is a zip file.
        Hide
        David Graham added a comment -

        I think the goal of these handlers is to be able to use a key to lookup the full
        object in the returned Map. So if you used the primary key column as the map
        key you would be able to lookup the object in the map based on the primary key.

        Rather than have a handler class for each type of object being stored in the map
        it might be better to have one class with a protected method that generates the
        object. The default behavior could be to generate a Map for the row but users
        could override that to generate a bean, arrray, etc. Maybe the class could be
        named KeyedHandler.

        DbUtils' minimum Java version is 1.3 so LinkedHashMap can't be used in the
        default implementation. Again, we could provide a protected factory method that
        users on 1.4 could override to return a LinkedHashMap.

        Show
        David Graham added a comment - I think the goal of these handlers is to be able to use a key to lookup the full object in the returned Map. So if you used the primary key column as the map key you would be able to lookup the object in the map based on the primary key. Rather than have a handler class for each type of object being stored in the map it might be better to have one class with a protected method that generates the object. The default behavior could be to generate a Map for the row but users could override that to generate a bean, arrray, etc. Maybe the class could be named KeyedHandler. DbUtils' minimum Java version is 1.3 so LinkedHashMap can't be used in the default implementation. Again, we could provide a protected factory method that users on 1.4 could override to return a LinkedHashMap.
        Hide
        David Graham added a comment -
            • COM-1753 has been marked as a duplicate of this bug. ***
        Show
        David Graham added a comment - COM-1753 has been marked as a duplicate of this bug. ***
        Hide
        David Graham added a comment -

        I added a KeyedHandler based on your MapMapHandler but customizable for possible
        implementations other than Maps. Thanks for the test case!

        Show
        David Graham added a comment - I added a KeyedHandler based on your MapMapHandler but customizable for possible implementations other than Maps. Thanks for the test case!

          People

          • Assignee:
            Unassigned
            Reporter:
            Piotr Lakomy
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development