spring和jdbctemplate-使用query、queryforlist或queryforrowset?

5n0oy7gb  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(658)

我的java(jdk6)项目使用spring和jdbctemplate进行所有的数据库访问。我们最近从Spring2.5升级到Spring3(rc1)。该项目不使用类似hibernate或ejb的orm。
如果我需要读取一堆记录,并对它们进行一些内部处理,那么似乎有几个(重载的)方法:query、queryforlist和queryforrowset
用一个代替另一个的标准是什么?是否存在性能差异?最佳实践?
你能推荐一些外部参考资料来进一步研究这个问题吗?

bqjvbblv

bqjvbblv1#

我发现访问as list的标准方法是通过 query() 方法而不是任何其他方法。两者的主要区别 query 另一种方法是您必须实现一个回调接口(或者 RowMapper , RowCallbackHandler ,或 ResultSetExtractor )来处理结果集。
RowMapper 很可能是你大部分时间都在用的东西。当结果集的每一行对应于列表中的一个对象时,就使用它。你只需要实现一个方法 mapRow 填充行中的对象类型并返回它。Spring也有一个 BeanPropertyRowMapper 它可以通过将bean属性名与列名匹配来填充列表中的对象(注意,这个类是为了方便而不是为了性能)。
RowCallbackHandler 当您需要的结果不仅仅是一个简单的列表时,它更有用。在使用这种方法时,必须自己管理返回对象。当我需要一个Map结构作为返回类型时(例如,对于树表的分组数据,或者如果我正在创建一个基于主键的自定义缓存),我通常会使用它。
ResultSetExtractor 用于控制结果的迭代。你暗示了一个单一的方法 extractData 这将是调用的返回值 query . 只有当我必须构建一些自定义数据结构时,我才发现自己在使用其他回调接口构建时更为复杂。
这个 queryForList() 方法的价值在于您不必实现这些回调方法。使用queryforlist有两种方法。第一种方法是,如果只查询数据库中的一列(例如字符串列表),则可以使用将类作为参数的方法版本自动为您提供仅包含这些类的对象的列表。
调用的其他实现时 queryForList() 您将得到一个列表,其中每个条目都是每个列的Map。虽然这样做很好,因为您可以节省编写回调方法的开销,但是处理这种数据结构非常不方便。你会发现自己做了很多铸造,因为Map的值是类型 Object .
我从来没见过 queryForRowSet 野外使用的方法。这将把查询的整个结果加载到 CachedRowSet 对象由spring sqlrowset调用。我认为使用这个对象有一个很大的缺点,就是如果你通过 SqlRowSet 围绕应用程序的其他层,您将这些层与数据访问实现相耦合。
您不应该看到这些调用之间有任何巨大的性能差异,除非我在 BeanPropertyRowMapper . 如果您正在处理一个大型结果集的一些复杂操作,那么您可能可以从编写一个优化的 ResultSetExtractor 针对你的具体情况。
如果您想了解更多信息,我将参考springjdbc文档和javadoc以了解我提到的类。您还可以查看一些关于spring框架的书籍。尽管使用spring框架进行java开发有点过时,但在使用jdbc框架方面有一个非常好的部分。最重要的是,我想说,只要试着用每种方法编写一些代码,看看什么最适合你。

ngynwnxp

ngynwnxp2#

除了上面的优秀答案之外,还有一个小小的补充:如果您运行一个简单的查询并且只需要一行,那么其他方法,比如queryforint、queryforlong、queryformap、queryforobject等,有时看起来可能是一个不错的选择。
但是,如果可以返回0或1行,queryforlist方法通常更简单,否则必须捕获incorrectresultsizedataaccessexception。我通过艰苦的方式学会了这一点。

d8tt03nd

d8tt03nd3#

既然你在奇妙的泛型土地,你可能真的想做的是使用 SimpleJdbcTemplate 使用它的 query() 方法 Lists 对象和 queryForObject() 对于单个对象。原因很简单,他们甚至更容易使用比那些在 JdbcTemplate .

相关问题