Java编程 - Spring和JDBCTemplate - 使用query,queryForList还是queryForRowSet?

Adr*_*ian 15 java spring recordset jdbctemplate

My Java(JDK6)项目使用SpringJDBCTemplate进行所有数据库访问.我们最近从Spring 2.5升级到Spring 3(RC1).该项目不使用像HibernateEJB这样的ORM .

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

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

您是否可以推荐一些外部参考资料以进一步研究该主题?

Jas*_*man 41

我发现作为列表访问的标准方法是通过query()方法而不是任何其他方法.之间的主要区别query与其他的方法是,你必须实现回调接口中的一个(或RowMapper,RowCallbackHandlerResultSetExtractor)来处理结果集.

A RowMapper很可能是大多数时候你会发现的.当结果集的每一行对应列表中的一个对象时使用它.您只需要实现一个方法mapRow,在该方法中填充行中的对象类型并将其返回.Spring还有一个BeanPropertyRowMapper可以通过将bean属性名称与列名称匹配来填充列表中的对象(注意,此类是为了方便而不是性能).

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

ResultSetExtractor当您想要控制结果的迭代时使用A. 您extractData将实现一个方法,该方法将是调用的返回值query.我只发现自己使用这个,如果我必须构建一些使用其他任何回调接口构建更复杂的自定义数据结构.

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

在调用其他实现时,queryForList()您将获得一个列表,每个条目都是每列的映射.虽然这很好,因为您节省了编写回调方法的费用,但处理这种数据结构非常笨拙.你会发现自己做了大量的投射,因为地图的值是类型的Object.

我实际上从未见过queryForRowSet野外使用过的方法.这会将查询的整个结果加载到CachedRowSetSpring SqlRowSet所包含的对象中.我发现使用这个对象有一个很大的缺点,如果你将SqlRowSet周围的数据传递给应用程序的其他层,你就会将这些层与数据访问实现相结合.

你不应该看到任何这些调用之间有任何巨大的性能差异,除非我提到过BeanPropertyRowMapper.如果您正在处理对大型结果集的一些复杂操作,那么通过ResultSetExtractor为特定情况编写优化,您可能会获得一些性能提升.

如果你想了解更多,我会参考Spring JDBC文档JavaDoc来了解我提到的类.您还可以查看Spring Framework上的一些书籍.尽管使用Spring Framework进行Java开发有点过时,但是有一个关于使用JDBC框架的非常好的部分.最重要的是,我会说尝试用每种方法编写一些代码,看看什么最适合你.