zoukankan      html  css  js  c++  java
  • 【jdbcTemplate】使用jdbcTemplate查询的三种回调

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

    • 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. } 
    12. return customers; 
    13. }
    14. });



    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对象添加到集合类中,方法最终只负责将组装完成的集合返回;


       




  • 相关阅读:
    GIL全局解释器锁、死锁、递归锁以及event事件与信号量、线程queue
    进程通信、消费者模型和线程
    COM inerop 创建自定义互操作集 问题
    工业自动化软件产业发展的探索与实践
    为什么都是a
    Dictionary用“集合初始值设定项”进行初始化
    非“自动实现的属性”也可以用“对象初始值设定项”进行初始化
    通过接口来解开依赖
    什么叫委派
    私有可写属性
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/4954099.html
Copyright © 2011-2022 走看看