Java 使用行映射器返回映射<;字符串,Map<;字符串,列表<;对象>&燃气轮机&燃气轮机;
数据库中的每一行都是这样的Java 使用行映射器返回映射<;字符串,Map<;字符串,列表<;对象>&燃气轮机&燃气轮机;,java,spring,spring-jdbc,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 1
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>>>
从Java检索结果集实际上需要40分钟
由于DB调用用于填充缓存对象(使用CRON每4小时填充一次),因此我不介意延迟40分钟,因为实际的REST调用将引用缓存对象。但我仍然希望尽可能高效地完成这项工作
另外,请让我知道,如果有任何其他方式,我可以处理这种情况。对于每一个REST调用,一个普通的jdbc调用都是昂贵的,因为我们每秒将收到100个请求。RowMapper 您可以实现一个状态完整的
RowMapper
来解决您的问题,但它并不真正符合RowMapper
的思想,后者被认为是无状态的,可以像JavaDoc中所述的那样重用:
。。。RowMapper对象通常是无状态的,因此可以重用
RowMapper
用于行到对象的转换,这意味着结果集的每一行都有自己的对象
ResultSetExtractor
真正适合您任务的是ResultSetExtractor
。ResultSetExtractor
用于按您的意愿将ResultSet转换为对象
只需通过迭代ResultSet实现填充映射,并将ResultSetExtractor
实现的实例传递给JdbcTemplate.query(…)
调用
更新2017-02-09 在评论使用
ResultSetExtractor
的示例会很有用时,我偶然发现了RowCallbackHandler
接口。虽然这两个选项都允许您实现所需的行为,但RowCallbackHandler
为您处理ResultSet
迭代。它也可以通过JdbcTemplate.query(…)
调用使用
对于
RowCallbackHandler
和ResultSetExtractor
的示例,我推荐以下文章Ram Satish:我假设您的每个实体都有一个DAO
类?为什么不让您的DAO将列表
转换为映射
,并将其返回到外部世界?jdbcTemplate调用在DAO内部,我想知道这是否可以使用RowMapper完成。因此,当您使用jdbcTemplate
执行查询时,您基本上希望它为您形成映射
?我相信您实现的任何解决方案最终都会在内部将列表
转换为映射
,那么为什么不让您的DAO
来实现呢?是的,这正是我想要的。但是,从JDBCTemplate获得的列表中,有没有一种方法可以做到这一点,或者我应该自己做到这一点?我想应该有一种方法可以做到这一点。但问题是你这么做的动机是什么?谢谢。但是,在我执行jdbc调用之后立即构建我的实际地图是否有效?(性能方面。)我正在使用的SELECT*fromtable
查询实际上需要40分钟才能完成。如果我想再次构建映射,我必须再次迭代结果集。这就是为什么我认为这种方法有助于提高性能。我今天尝试了ResultsTextRactor,并且能够完成我想要做的事情。您能否添加一个关于ResultsTextRactor如何工作的小实现片段,以便答案对其他人更有用?
SELECT * from TABLENAME