如何在 jdbc 模板中实现 RowMapper

Posted

技术标签:

【中文标题】如何在 jdbc 模板中实现 RowMapper【英文标题】:How to implement RowMapper in jdbc template 【发布时间】:2016-07-01 08:47:01 【问题描述】:

我有一个查询,它给出以下输出:

State  CST QTY
aa      0   10
aa      1   20
aa      2   30
aa      3   40
ac      0   10
ac      1   20
ac      2   30
ac      3   40

我在 spring mvc 中使用 jdbc 模板:在实现 RowMapper 时,我很困惑需要使用哪个数据结构以及如何映射每一行以在 EXPECTED O/P 之后获得以下输出:

STATE CST0 CST CST2 CST3 
aa      10  20  30   40
ac      10  20  30   40

谁能帮帮我?

【问题讨论】:

这是一个表数据透视问题,您可以在 sql 查询中执行此操作。 不改变查询是不可能的? 如果您坚持使用RowMapper 则不会...但是为什么根据需要使其更复杂,数据库非常有能力做到这一点,并且可能比将大量数据传输到您的 Java 应用程序并使用您的应用程序对其进行转换。 我没有修改查询的选项,我应该只用java来做 【参考方案1】:

如果您使用的是 Google Guava 库,则可以使用名为 Multimap 的新集合。多重映射是从唯一键映射到值集合:Map<K, List<V>>Map<K, Set<V>>

我宁愿使用接口RowCallbackHandler,而不是使用RowMapper,这是处理结果集的类似接口:

public class MyRowMapper implements RowCallbackHandler

   private Multimap<String, Integer> stateByQuantity = new ArrayListMultimap();

    void processRow(ResultSet rs) throws SQLException 
      String state = rs.getString("State");
      Integer qty = rs.getInt("QTY");
      stateByQuantity.put(state, qty);          
    

【讨论】:

【参考方案2】:

我已使用以下 sn-p 来满足我的要求:

List<Map<String, Object>> resultMapList= new ArrayList<Map<String, Object>>();

      Map<String, List<Map<String, Integer>>>  listMap= new TreeMap<String, List<Map<String, Integer>>>();

      for(Map<String, Object> mapList:resultMapList)
          List< Map<String, Integer>> ListMapPair= new ArrayList<Map<String, Integer>>();
          Map<String, Integer> entry= new HashMap<String, Integer>();
      

      Map<String, List<Object>> m= new HashMap<String, List<Object>>();

      List<Object> list= new ArrayList<Object>();
      list.add(1);
      list.add(2);
      list.add(3);
      m.put("a", list);

      List<Object> list1= new ArrayList<Object>();
      list1.add(4);
      list1.add(5);
      list1.add(6);
      m.put("b", list1);

      m.put("c", list);

      System.out.println(m);

输出如下:

a=[1, 2, 3], b=[4, 5, 6], c=[1, 2, 3]

【讨论】:

以上是关于如何在 jdbc 模板中实现 RowMapper的主要内容,如果未能解决你的问题,请参考以下文章

如何在django模板中实现列表迭代[重复]

如何在 Django 模板中实现面包屑?

如何在AngularJS中实现带有输入字段的模板组件

如何在 C++ 模板容器中实现 erase() 方法

通过在 Android 中实现 Proguard 在使用 JDBC 的 Asynctask 中应用程序崩溃

通过在Android中实现Proguard,使用JDBC在Asynctask中崩溃