Spring Template查询数据 三种callback之间的区别

一、org.springframework.jdbc.core.ResultSetExtractor.  java

  基本上属于JdbcTemplate内部使用的Callback接口,相对于下面两个Callback接口来讲,ResultSetExtractor拥有更多的控制权,由于使用它,你须要自行处理ResultSet:spring

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以后,你能够将处理后的结果以任何你想要的形式包装后返回。 sql

二、org.springframework.jdbc.core.RowCallbackHandler.  app

  RowCallbackHandler相对于ResultSetExtractor来讲,仅仅关注单行结果的处理,处理后的结果能够根据须要存放到当前RowCallbackHandler对象内或者使用JdbcTemplate的程序上下文中,固然,这个彻底是看我的爱好了。ide

  RowCallbackHandler的定义以下: this

package org.springframework.jdbc.core;

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

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

三、org.springframework.jdbc.core.RowMapper.google

  它是 ResultSetExtractor的精简版,功能相似于 RowCallbackHandler,也是只关注当行结果的处理。不过它的返回的结果会有 ResultSetExtractor实现类进行组合。spa

  RowMapper的接口定义以下:code

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上

相关文章
相关标签/搜索