我的数据库中的每一行都将是这样的
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个请求。
答案 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