Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式

Spring对JDBC封装时使用的一种CallBack来参数化一个操作的模式

Spring对JDBC的封装避免了大量的JDBC低级操作,简化了代码,下面我们看看Spring除
了使用Template方法模式来简化我们编写的代码还是用了什么技巧。Spring使用了一种
叫做CallBackHandler的接口,你可以很容易扩展这个接口来获得想要查询到的结果,下
面举一个获得行信息的一个CallBackHandler,然后StringHandler实现获取查询到的String
的例子:

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式interface  RowCallBackHandler ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
public   void   abstract  processRow(ResultSet rs) throws  SQLException;
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式 }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
class  StringHandler  implements  RowCallBackHandler ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
private  List list;
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
public   void  processRow(ResultSet rs) throws  SQLException; ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         list.add(rs.getString(
1 ));
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
public  String[] getStrings() ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
return  (String[])list.toArray( new  String[list.size()]))
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式 }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
public   class   JdbcTemplate ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
// ...other code
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
     public  query(String sql,RowCallBackHandler callBackHandler) ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         Connection con 
=   null ;
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         PreparedStatement ps 
=   null ;
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         ResultSet rs 
=   null ;
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         
try ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             
//  con = <code to get connetion>
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
            ps  =  con.prepareStatement(sql);
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             rs.executeQuery();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             
while (rs.next()) ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式                 callBackHandler.processRow(rs);
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             rs.close();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             ps.close();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         }
catch (SQLException e) ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             e.printStackTrace();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         }
finally ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式             DataSourceUtils.closeConnectonIfNecessary(
this .dataSource,con);
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式 }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式
public   class  SimpleTest ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     
public   static   void  main(String []args) ... {
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         StringHandler sh 
=   new  StringHandler();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         JdbcTemplate jdbcTemplate 
=   new  JdbcTemplate();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         jdbcTemplate.query(
" Select firstName from user " ,sh);
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式         String []str 
=  sh.getStrings();
Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式     }

Spring对JDBC打包时使用的一种CallBack来参数化一个操作的模式 }

 

这个模式关键的技巧是参数一个操作并JdbcTemplate中主动调用方法processRow(),将结
果集中的信息添加到List中,这个可以说一种控制反转的思想。查询的结果是在查询过程中
自动注入到我们的要接收查询结果的容器中的,用户不需要关心如何去获得查询结果,当需
要结果是只需要getStrings()获得。
用户只需要使用如下代码:
StringHandler sh = new StringHandler();
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.query("Select firstName from user",sh);
String []str = sh.getStrings();
就可以轻易获得查询的结果。
不过这个模式可以说更多的是一种技巧,直观程度不够,从而使代码不容易理解和维护。