Spring Template查詢數據 三種callback之間的區別


1、org.springframework.jdbc.core.ResultSetExtractor. 

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

package org.springframework.jdbc.core;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.dao.DataAccessException;

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

 

在直接處理完ResultSet之后,你可以將處理后的結果以任何你想要的形式包裝后返回。 

2、org.springframework.jdbc.core.RowCallbackHandler. 

  RowCallbackHandler相對於ResultSetExtractor來說,僅僅關注單行結果的處理,處理后的結果可以根據需要存放到當前RowCallbackHandler對象內或者使用JdbcTemplate的程序上下文中,當然,這個完全是看個人愛好了。

  RowCallbackHandler的定義如下: 

package org.springframework.jdbc.core;

import java.sql.ResultSet;
import java.sql.SQLException;

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

3、org.springframework.jdbc.core.RowMapper.

  它是 ResultSetExtractor的精簡版,功能類似於 RowCallbackHandler,也是只關注當行結果的處理。不過它的返回的結果會有 ResultSetExtractor實現類進行組合。

  RowMapper的接口定義如下:

package org.springframework.jdbc.core;

import java.sql.ResultSet;
import java.sql.SQLException;

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

為了說明這三種回調接口的使用方法,我們暫時設置如下的場景: 假設我們有一表users,里面有userid,username,userpwd三個字段,我們為此建立了一個JavaBean:

 package com.google.spring.jdbc;
 
public class UserBean{
private Integer userId; private String username; private String userpwd; public Integer getUserId(){ return userId; } public void setUserId(Integer userId){ this.userId = userId; } public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } public String getUserpwd(){ return userpwd; } public void setUserpwd(String userpwd){ this.userpwd = userpwd; } }

使用自定義的ResultSetExtractor,可以如下進行處理:

List users = (List)jdbcTemplate.query("SELECT * FROM USERS WHERE USERNAME LIKE '%n%'", new ResultSetExtractor()
{
    
    @Override
    public Object extractData(ResultSet rs) throws SQLException,
            DataAccessException
    {
        List users = new ArrayList();
        while(rs.next())
        {
            UserBean userBean = new UserBean();
            userBean.setUserId(rs.getInt("userId"));
            userBean.setUsername(rs.getString("username"));
            userBean.setUserpwd(rs.getString("userpwd"));
            users.add(userBean);
        }
        return users;
    }
});
System.out.println(users);

使用RowCallbackHandler可進行如下的處理:

final List users = new ArrayList();
jdbcTemplate.query("SELECT * FROM USERS WHERE USERNAME LIKE '%n%'", new RowCallbackHandler()
{
    @Override
    public void processRow(ResultSet rs) throws SQLException
    {
        UserBean userBean = new UserBean();
        userBean.setUserId(rs.getInt("userId"));
        userBean.setUsername(rs.getString("username"));
        userBean.setUserpwd(rs.getString("userpwd"));
        users.add(userBean);
    }
});
System.out.println(users.size());

 

使用RowMapper,可進行如下的處理:

List users = jdbcTemplate.query("SELECT * FROM USERS WHERE USERNAME LIKE '%n%'", new RowMapper()
{
    @Override
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException
    {
        UserBean userBean = new UserBean();
        userBean.setUserId(rs.getInt("userId"));
        userBean.setUsername(rs.getString("username"));
        userBean.setUserpwd(rs.getString("userpwd"));
        return userBean;
    }
});
System.out.println(users.size());

以上是以jdbcTemplate為例,介紹了3種回調接口的用法,其實還可以擴展到hbaseTemplate上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM