当前位置: 首页 > 知识库问答 >
问题:

使用RowMapper返回Map

江曦
2023-03-14

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

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类中有一个静态映射吗?但我不希望它是静态的,因为这是一个webservice,后续调用可能会出错。),我只能选择获取该行列表,然后使用逻辑创建所需的集合。

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

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

编辑:我的查询是如下所示的选择查询:

SELECT * from TABLENAME

实际上,从Java检索结果集需要40分钟。

由于DB调用是为了填充缓存对象,这是每4小时使用CRON完成的,因此我不介意实际REST调用将引用缓存对象,因此延迟40分钟。但我仍然希望尽可能有效地做到这一点。

另外,如果有任何其他方法可以处理这种情况,请告诉我。每个REST调用的普通jdbc调用都会很昂贵,因为我们每秒会收到100个请求。

共有1个答案

南门刚捷
2023-03-14

行映射器

您可以实现一个状态完整的行映射器来解决您的问题,但它并不真正符合被认为是无状态的、可重用的行映射器的思想,如JavaDoc中所述:

... 行映射器对象通常是无状态的,因此可以重用。。。

行映射器用于行到对象的转换,这意味着结果集的每一行都有自己的对象。

结果文本提取器

真正适合您任务的是ResultSetExtractorResultSetExtractor是为您打算进行的ResultSet到Object转换而制作的。

只需通过迭代ResultSet来实现填充映射,并将ResultSetExtractor实现的实例传递给JdbcTemplate。查询(…) 呼叫。

更新2017-02-09

在评论使用ResultSetExtractor的示例很有用时,我偶然发现了RowCallbackHandler接口。虽然这两个选项都允许您实现所需的行为,但RowCallbackHandler为您处理结果集迭代。它可以通过JdbcTemplate使用。查询(…) 调用。

对于RowCallbackHandlerResultSetExtractor的示例,我推荐以下文章Ram Satih:http://www.javarticles.com//2015/02/example-of-spring-callbacks-used-in-jdbctemplate.html

 类似资料:
  • 我正在使用JdbcTemplate。query(sql、args、rowMapper)方法调用以返回对象列表。在某些情况下,我希望跳过一行,而不将其添加到返回的列表中。在这些情况下,我想到了两种解决方案: 让行映射器返回null 让RowMapper抛出一个异常(我知道SQLExceptions已被处理,所以这是一种可能性) 我的问题是:当返回null时,JdbcTemboard是否将其添加到列表

  • 问题内容: 在我的UserDao中,我想返回一个用户列表。 我已经有那个了。 我怎样才能做到这一点? 我试过了: 但是不确定如何使用UserRowMapper填充User对象并将其插入我的用户列表List中。 顺便说一句,这是我应该使用的最好的通用列表: ? 问题答案: 使用,您可以为占位符传递可变数量的值作为最后一个参数: 或类似的东西: 实际上,该方法已多次重载,因此通常可以找到至少一种在任何

  • JdbcTemplate使用org.springframework.jdbc.core.RowMapper《T》接口以逐行映射ResultSet的行。 此接口的实现执行将每行映射到结果对象的实际工作。 如果抛出任何抛出的SQLExceptions将被调用JdbcTemplate捕获并处理。 接口声明 (Interface Declaration) 以下是org.springframework.jd

  • JdbcTemplate使用org.springframework.jdbc.core.RowMapper《T》接口以逐行映射ResultSet的行。 此接口的实现执行将每行映射到结果对象的实际工作。 如果抛出任何抛出的SQLExceptions将被调用JdbcTemplate捕获并处理。 接口声明 (Interface Declaration) 以下是org.springframework.jd

  • 我正在使用routerLink返回我的页面。 当前路线可以有3个级别: 此外,我有一些不同的组件,所以它不一定总是父级,它可以是parent1或parent2,也可以是子级和孙级,例如: 我想要的总是转到上一级,例如: 我所做的是: 但它总是导航到“myurl.com” 我如何解决它? 正如一些用户所建议的,我正在共享我的路由配置: 应用程序内。路由。ts: 在父级中。路由。ts: 如果我在浏览器