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

2014-11-23 22:54:41 · 作者: · 浏览: 0
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("use