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上