使用RowMapper返回Map <string,map <string,list <object>&gt;&gt;

时间:2017-02-03 14:25:41

标签: java spring spring-jdbc

我的数据库中的每一行都将是这样的

School  Class   StudentID   Name    Age
123      8        811       John    10
123      8        812       Smith   11
123      8        821       John    12
123      8        822       Smith   13
123      9        911       John    14
123      9        912       Smith   15
456      8        811       John    10
456      8        812       Smith   11

现在我想像这样返回上面的数据

Map<String,Map<String,List<Object>>>

ie. Map<School,Map<Class,List<StudentID>>>

我正在使用Spring JdbcTemplate RowMapper,但我能得到的只是所有行的列表。因为我不能在我的RowMapper中维护我的主Map(我可以在RowMapper类中有一个静态映射吗?但我不希望它是静态的,因为这是一个web服务,后续调用可能会被搞砸。 ),我只能选择获取此Row列表,然后让我的逻辑来创建我想要的Collection。

我开始了解ResultSetExtractor,但我找不到如何使用它完成这项工作。

如果有任何方法可以使用行映射器或某种方式完成此操作,请告诉我。或者我解决这个问题的唯一方法是我必须再次迭代列表并得到我想要的东西。

修改 我的查询是这样的选择查询:

SELECT * from TABLENAME

从Java中检索ResultSet实际上需要40分钟。

由于DB调用是用于填充每4小时使用CRON完成的缓存对象,因此我不介意自实际REST调用以来40分钟的时间延迟将引用缓存对象。但我仍然希望尽可能高效地完成这项工作。

另外请告诉我是否有其他办法可以处理这种情况。每次REST调用的正常jdbc调用都会很昂贵,因为我们每秒会收到100个请求。

1 个答案:

答案 0 :(得分:1)

<强>的RowMapper

你可以实现一个解决你的问题的状态满RowMapper,但它并不真正符合RowMapper的想法,它被认为是无状态的,可重用的,如JavaDoc中所述:

  

... RowMapper对象通常是无状态的,因此可以重复使用......

RowMapper用于行到对象的转换,这意味着 ResultSet 的每一行都有一个自己的对象

<强> ResultSetExtractor类

真正的ResultSetExtractor适合你的任务。 {I}是为 ResultSet 进行对象转换的。{/ p>。

只需通过迭代 ResultSet 实现填充Map,并将ResultSetExtractor实现的实例传递给ResultSetExtractor调用。

更新2017-02-09

在关注使用JdbcTemplate.query(...)的示例有用的评论时,我偶然发现了ResultSetExtractor界面。虽然这两个选项都允许您实现所需行为,但RowCallbackHandler会为您处理RowCallbackHandler次迭代。它也可以通过ResultSet调用使用。

有关JdbcTemplate.query(...)RowCallbackHandler的示例,我建议使用以下文章Ram Satish:http://www.javarticles.com//2015/02/example-of-spring-callbacks-used-in-jdbctemplate.html