用于查询的回调接口定义主要有以下三种:

  • org.springframework.jdbc.core.ResultSetExtractor.  基本上属于JdbcTemplate内部使用的Callback接口,相对于下面两个Callback接口来说,ResultSetExtractor拥有更多的控制权,因为使用它,你需要自行处理ResultSet:

    1. public interface ResultSetExtractor { 
    2. Object extractData(ResultSet rs) throws SQLException, DataAccessException;
    3. }

    在直接处理完ResultSet之后,你可以将处理后的结果以任何你想要的形式包装后返回。


  • org.springframework.jdbc.core.RowCallbackHandler.  RowCallbackHandler相对于ResultSetExtractor来说,仅仅关注单行结果的处理,处理后的结果可以根据需要存放到当前RowCallbackHandler对象内或者使用JdbcTemplate的程序上下文中,当然,这个完全是看个人爱好了。 RowCallbackHandler的定义如下:

    1. public interface RowCallbackHandler {
    2. void processRow(ResultSet rs) throws SQLException;
    3. }



  • org.springframework.jdbc.core.RowMapper.  ResultSetExtractor的精简版,功能类似于RowCallbackHandler,也只关注处理单行的结果,不过,处理后的结果会由ResultSetExtractor实现类进行组合。 RowMapper的接口定义如下:

    1. public interface RowMapper {
    2. Object mapRow(ResultSet rs, int rowNum) throws SQLException;
    3. }


为了说明这三种Callback接口的使用和相互之间的区别,我们暂且设定如下场景:

数据库表customer中存在多行信息,对该表查询后,我们需要将每一行的顾客信息都映射到域对象Customer中,并以java.util.List的形式返回所有的查询结果。

现在,我们分别使用这三种Callback接口对customer表进行查询:


ResultSetExtractor

  1. List customerList = (List)jdbcTemplate.query("select * from customer", 
  2. new ResultSetExtractor(){
  3. public Object extractData(ResultSet rs) throws SQLException,DataAccessException { 
  4. List customers = new ArrayList();
  5. while(rs.next()) { 
  6. Customer customer = new Customer(); 
  7. customer.setFirstName(rs.getString(1)); 
  8. customer.setLastName(rs.getString(2)); 
  9. ... 
  10. customers.add(customer); 
  11. return customers; 
  12. }
  13. });



RowMapper对每一行进行处理

  1. List customerList = jdbcTemplate.query("select * from customer", 
  2. new RowMapper(){ 
  3. public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { 
  4. Customer customer = new Customer(); 
  5. customer.setFirstName(rs.getString(1)); 
  6. customer.setLastName(rs.getString(2)); 
  7. ... 
  8. return customer; 
  9. }
  10. });



processRow

  1. final List customerList = new ArrayList(); 

  2. jdbcTemplate.query("select * from customer", 
  3. new RowCallbackHandler(){ 
  4. public void processRow(ResultSet rs) throws SQLException { 
  5. Customer customer = new Customer(); 
  6. customer.setFirstName(rs.getString(1)); 
  7. customer.setLastName(rs.getString(2)); 
  8. ... 
  9. customerList.add(customer); 
  10. }
  11. }
  12. );



如果你没有发现最大的差异在哪里,那么容我细表:

  • 使用三种Callback接口作为参数的query方法的返回值不同:

    • 以ResultSetExtractor作为方法参数的query方法返回Object型结果,要使用查询结果,我们需要对其进行强制转型

    • 以RowMapper接口作为方法参数的query方法直接返回List型的结果;

    • 以RowCallbackHandler作为方法参数的query方法,返回值为void;

  • 使用ResultSetExtractor作为Callback接口处理查询结果,我们需要自己声明集合类,自己遍历ResultSet,自己根据每行数据组装Customer对象,自己将组装后的Customer对象添加到集合类中,方法最终只负责将组装完成的集合返回;


【jdbcTemplate】使用jdbcTemplate查询的三种回调的更多相关文章

  1. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  2. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  3. iOS_Swift初识之使用三种回调方式自定义Button

    最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理 ...

  4. Oracle 数据库分页查询的三种方法

    一.Oracle 数据库分页查询的三种方法 1.简介 不能对 rownum 使用 >(大于或等于 1 的数值).>=(大于 1 的数值).=(不等于 1 的数值),否则无结果.所以直接用 ...

  5. [教程]Delphi 中三种回调函数形式解析

    Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...

  6. JdbcTemplate查询数据 三种callback之间的区别

    JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法. 如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便 ...

  7. Spring之jdbcTemplate:查询的三种方式(单个值、单个对象、对象集合)

    JdbcTemplateDemo2.java package helloworld.jdbcTemplate; import org.springframework.jdbc.core.JdbcTem ...

  8. IOS常见的三种回调方法介绍

    认识下三种IOS常见的回调模式. 代理模式作为IOS中最常见的通讯模式,代理几乎无处不在. 这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去. 设置协议及方法 @protocol Cal ...

  9. Android之——ContentResolver查询的三种方式

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47785491 今天做到一个小项目.查询手机中短信的信息,当然得去系统暴露出来的数据 ...

随机推荐

  1. dalvik虚拟内存管理之二——垃圾收集

    转载自http://www.miui.com/thread-75028-1-1.html 垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率.顾 ...

  2. php中读取文件内容的几种方法

    1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 ...

  3. 用jquery ,当改变窗口或屏幕大小时调用function,用哪个事件?

    $(window).resize(function(){ //process here}); window的onresize事件. $(window).resize(function () {     ...

  4. hihoCoder挑战赛23

    hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...

  5. DELPHI相应鼠标滚轮

    在鼠标的MouseWheel事件里写入以下内容 if WheelDelta < 0 then    SendMessage(scrollBox1.Handle, WM_VSCROLL, SB_L ...

  6. Kali安装

    Kali Linux 前身是 BackTrack ,不过Kali Linux是基于Debian 的 Linux 发行版,而BackTrack 则是基于Uubntu的,现在BackTrack 已经不更新 ...

  7. Draw a Border around any C# Winform Control

    public class MyGroupBox : GroupBox { protected override void OnPaint(PaintEventArgs e) { base.OnPain ...

  8. Checking the content of the pointer

    https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/d481b7ec-cd67-476c-b2d7-ca3334effa16/h ...

  9. SQL_TRACE与tkprof分析

    一. SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL ...

  10. Unity3D 几个基本动画(控制物体移动、旋转、缩放)

    Transform基本移动函数: 1.指定方向移动: //移动速度 float TranslateSpeed = 10f; //Vector3.forward 表示"向前" tra ...