gpt4 book ai didi

Java 编程 - Spring 和 JDBCTemplate - 使用查询、queryForList 还是 queryForRowSet?

转载 作者:IT老高 更新时间:2023-10-28 13:53:17 34 4
gpt4 key购买 nike

我的 Java (JDK6) 项目使用 SpringJDBCTemplate对其所有数据库访问。我们最近从 Spring 2.5 升级到 Spring 3 (RC1)。该项目不使用像 Hibernate 这样的 ORM也不是 EJB .

如果我需要读取一堆记录,并对它们进行一些内部处理,似乎有几种(重载)方法:query、queryForList 和 queryForRowSet

使用一个而不是另一个的标准应该是什么?有性能差异吗?最佳实践?

您能否推荐一些外部引用资料以进一步研究该主题?

最佳答案

我发现作为列表访问的标准方法是通过 query() 方法而不是任何其他方法。 query 和其他方法的主要区别在于您必须实现其中一个回调接口(interface)(RowMapperRowCallbackHandlerResultSetExtractor) 来处理你的结果集。

RowMapper 可能是您发现自己大部分时间都在使用的。当结果集的每一行对应于列表中的一个对象时使用它。您只需要实现一个方法 mapRow 来填充行中的对象类型并返回它。 Spring 也有一个 BeanPropertyRowMapper,它可以通过将 bean 属性名称与列名称匹配来填充列表中的对象(注意,此类是为了方便而不是性能)。

RowCallbackHandler 当你需要你的结果不仅仅是一个简单的列表时更有用。您必须自己管理使用此方法的返回对象。当我需要一个 map 结构作为我的返回类型时(例如,对于树表的分组数据,或者如果我正在创建基于主键的自定义缓存),我通常会发现自己使用它。

ResultSetExtractor 用于控制结果的迭代。您实现了一个方法 extractData,它将作为调用 query 的返回值。如果我必须构建一些使用其他回调接口(interface)构建起来更复杂的自定义数据结构,我只会发现自己使用它。

queryForList() 方法很有值(value),因为您不必实现这些回调方法。有两种方式使用 queryForList。第一个是如果您只从数据库中查询单个列(例如字符串列表),您可以使用将 Class 作为参数的方法的版本自动为您提供这些类的唯一对象列表.

当调用 queryForList() 的其他实现时,您将得到一个列表,其中每个条目是每个列的映射。虽然这很好,因为您节省了编写回调方法的费用,但处理这种数据结构相当笨拙。由于 map 的值是 Object 类型,您会发现自己做了很多转换。

我实际上从未见过在野外使用的 queryForRowSet 方法。这会将查询的整个结果加载到由 Spring SqlRowSet 交换的 CachedRowSet 对象中。我看到使用这个对象的一个​​很大的缺点是,如果你将 SqlRowSet 传递给应用程序的其他层,你会将这些层耦合到数据访问实现中。

除了我提到的 BeanPropertyRowMapper 之外,您不应该看到任何这些调用之间的任何巨大性能差异。如果您正在对大型结果集进行一些复杂的操作,则可以通过为您的特定情况编写优化的 ResultSetExtractor 来获得一些性能提升。

如果您想了解更多信息,我会咨询 Spring JDBC documentationJavaDoc for the classes I've mentioned .您还可以查看一些有关 Spring Framework 的书籍。虽然有点过时了Java Development with the Spring Framework关于使用 JDBC 框架有一个很好的部分。最重要的是,我想说的是,试着用每种方法编写一些代码,看看哪种方法最适合你。

关于Java 编程 - Spring 和 JDBCTemplate - 使用查询、queryForList 还是 queryForRowSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1660756/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com