代码之家  ›  专栏  ›  技术社区  ›  Adrian

Java编程-Spring和JDBCTemplate-使用query、queryForList或queryForRowSet?

  •  15
  • Adrian  · 技术社区  · 15 年前

    Spring JDBCTemplate Hibernate 也不是 EJB .

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

    使用其中一个而不是另一个的标准应该是什么?是否存在性能差异?最佳实践?

    3 回复  |  直到 15 年前
        1
  •  42
  •   Jason Gritman    15 年前

    我发现访问as列表的标准方法是通过 query() query RowMapper , RowCallbackHandler ,或 ResultSetExtractor )来处理结果集。

    行映射器 mapRow 填充行中的对象类型并返回它。春天也有春天 BeanPropertyRowMapper 它可以通过将bean属性名与列名相匹配来填充列表中的对象(注意,这个类是为了方便而不是为了性能)。

    A RowCallbackHandler

    A 结果文本采集器 当您想要控制结果的迭代时使用。你实施了一个单一的方法 extractData 质疑 . 只有当我必须使用其他回调接口构建更复杂的自定义数据结构时,我才发现我自己在使用它。

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

    调用的其他实现时 您将得到一个列表,其中每个条目都是每个列的映射。虽然这样做很好,因为您可以节省编写回调方法的费用,但处理这种数据结构相当麻烦。你会发现自己做了很多铸造,因为地图的值是类型 Object

    事实上,我从来没有见过这种情况 queryForRowSet 野外使用的方法。这将把整个查询结果加载到 CachedRowSet 对象被Spring SqlRowSet调用。我认为使用这个对象有一个很大的缺点,如果你通过 SqlRowSet 围绕应用程序的其他层,您将这些层耦合到数据访问实现。

    BeanPropertyRowMapper . 如果您正在处理大型结果集的一些复杂操作,那么您可能会从编写优化的 结果文本采集器

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

        2
  •  3
  •   Esko    15 年前

    因为你在奇妙的泛型领域,你可能真正想做的是使用 SimpleJdbcTemplate query() 方法 Lists queryForObject() 对于单个对象。原因很简单,就是它们比中的更容易使用 JdbcTemplate .

        3
  •  3
  •   todd.pierzina    15 年前

    但是,如果可以返回0或1行,queryForList方法通常更容易,否则必须捕获IncorrectResultSizeDataAccessException。我通过艰苦的方式学会了这一点。