jdbcTemplate查詢的三種回調

首先我們先了解一下什麼時回調?

從維基百科上面摘抄定義:(看完本篇文章再來理解這個定義)
在計算機程序設計中,回調函數,或簡稱回調,是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
也就是說底層封裝的時候預留了回調函數接口,程序員可以可以通過底層封裝的接口回調自己寫的方法。
下面是例子。

  1. 首先定義一個類Caller,按照上面的定義就是程序員A寫的程序a,這個類裏面保存一個接口引用。
public class Caller {    
    private MyCallInterface callInterface;    

    public Caller() {    
    }    

    public void setCallFunc(MyCallInterface callInterface) {    
        this.callInterface = callInterface;    
    }    

    public void call() {    
        callInterface.printName();    
    }    
}   

2.當然需要接口的定義,爲了方便程序員B根據我的定義編寫程序實現接口。

public interface MyCallInterface {    
    public void  printName();    
}  
 3.  第三是定義程序員B寫的程序b
 第三是定義程序員B寫的程序b


public class Client implements MyCallInterface {    

    @Override    
    public void printName() {    
        System.out.println("This is the client printName method");    
    }    
}    


       4.  測試如下

public class Test {    
    public static void main(String[] args) {    
        Caller caller = new Caller();    
        caller.setCallFunc(new Client());    
        caller.call();    
    }    
}   



      看到這裏應該明白什麼是回調了,有些文章介紹的很好,但是剛開始沒看明白,是因爲把第3步的類省略,直接寫成匿名類了。
        5.  在測試方法中直接使用匿名類,省去第3步。

public class Test {    
    public static void main(String[] args) {    
        Caller caller = new Caller();    
//      caller.setCallFunc(new Client());    
        caller.setCallFunc(new MyCallInterface() {    
            public void printName() {    
                System.out.println("This is the client printName method");    
            }    
        });    
        caller.call();    
    }    
}   

那麼接下來讓我們聊一下jdbctemplate的三個回調函數

“`
org.springframework.jdbc.core.ResultSetExtractor.  基本上屬於JdbcTemplate內部使用的Callback接口,相對於下面兩個Callback接口來說,ResultSetExtractor擁有更多的控制權,因爲使用它,你需要自行處理ResultSet:

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

在直接處理完ResultSet之後,你可以將處理後的結果以任何你想要的形式包裝後返回。
org.springframework.jdbc.core.RowCallbackHandler.  RowCallbackHandler相對於ResultSetExtractor來說,僅僅關注單行結果的處理,處理後的結果可以根據需要存放到當前RowCallbackHandler對象內或者使用JdbcTemplate的程序上下文中,當然,這個完全是看個人愛好了。 RowCallbackHandler的定義如下:

public interface RowCallbackHandler
{
void processRow(ResultSet rs) throws SQLException;
}

org.springframework.jdbc.core.RowMapper.  ResultSetExtractor的精簡版,功能類似於RowCallbackHandler,也只關注處理單行的結果,不過,處理後的結果會由ResultSetExtractor實現類進行組合。 RowMapper的接口定義如下:

public interface RowMapper
{
Object mapRow(ResultSet rs, int rowNum) throws SQLE““`
ception;
}

“`爲了說明這三種Callback接口的使用和相互之間的區別,我們暫且設定如下場景:
數據庫表customer中存在多行信息,對該表查詢後,我們需要將每一行的顧客信息都映射到域對象Customer中,並以Java.util.List的形式返回所有的查詢結果。
現在,我們分別使用這三種Callback接口對customer表進行查詢:

List customerList = (List)jdbcTemplate.query(“select * from customer”, new ResultSetExtractor(){

public Object extractData(ResultSet rs) throws SQLException,DataAccessException 
{
    List customers = new ArrayList();
    while(rs.next())
    {
        Customer customer = new Customer();
        customer.setFirstName(rs.getString(1));
        customer.setLastName(rs.getString(2));
        ...
        customers.add(customer);
    }
    return customers;
}});

List customerList = jdbcTemplate.query(“select * from customer”, new RowMapper(){

public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
    Customer customer = new Customer();
    customer.setFirstName(rs.getString(1));
    customer.setLastName(rs.getString(2));
    ...
    return customer;
}});

final List customerList = new ArrayList();

jdbcTemplate.query(“select * from customer”, new RowCallbackHandler(){

public void processRow(ResultSet rs) throws SQLException {
    Customer customer = new Customer();
    customer.setFirstName(rs.getString(1));
    customer.setLastName(rs.getString(2));
    ...
    customerList.add(uery方法返回Object型結果,要使用查詢結果,我們需要對其進行強制轉型;

以RowMapper接口作爲方法參數的query方法直接返回List型的結果;
以RowCallbackHandler作爲方法參數的query方法,返回值爲void;
使用ResultSetExtractor作爲Callback接口處理查詢結果,我們需要自己聲明集合類,自己遍歷ResultSe
使用ResultSetExtractor作爲Callback接口處理查詢結果,我們需要自己聲明集合類,自己遍歷

使用ResultSetExtractor作爲Callback接口處理查詢結果,我們需要自己聲明集合類,自己遍歷ResultSet,自己根據每行數據組裝Customer對象,自己將組裝後的Customer對象添加到集合類中,方法最終只負責將組裝完成的集合返回;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章