日期:2014-05-16  浏览次数:20538 次

使用spring的JdbcTemplate进行查询的三种回调方式的比较

我们做过的很多项目中都会使用spring的JdbcTemplate进行结果集的查询操作,以前在使用的时候一直都是“拿来主义”,功能实现了就OK了,没有深究什么内容,特别是查询接口的回调内容方法,没有过多的研究过细节内容。最近一次使用JdbcTemplate进行查询操作,发现了一些有规律的内容,所以就深入学习了一下。和大家一起探讨一下:

?

对于spring的JdbcTemplate进行结果集查询操作,spring给我们开发的是一系列的query方法,这些查询的方法中回调的接口主有三种:ResultSetExtractorRowCallbackHandlerRowMapper这个内容有图有真相:


?

但是这三种回调接口具体的用法和区别,我们一起来看一下:

场景设定,数据库中存在T_USER表,表中存在多条数据,需要将是表中数据映射到User对象上

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

? ? ?ResultSetExtractor接口中定义的方法如下:

? ? ?

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

?

? ? ? ? 如果使用ResultSetExtractor接口作为回调方法,查询方式如下:

??

List<User> userList = (List<User>)jdbcDao.getJdbcTemplate().
                                   query("select * from T_USER", new ResultSetExtractor() {
            @Override
            public Object extractData(ResultSet rs) throws SQLException, 
                                                            DataAccessException {
                 List<User> userList = new ArrayList<User>();
                 while (rs.next()) {
                    User user = new User();
                    user.setId(rs.getInt("N_ID"));
                    user.setName(rs.getString("C_NAME"));
                    userList.add(user);
                 }
                 return userList;
            }
    });

?

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

? ? ? ? ? ? ? RowCallbackHandler接口中定义的方法如下:

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

     }

?

? ? ? ? 如果使用RowCallbackHandler接口作为回调方法,查询方式如下:

final List<User> userList = new ArrayList<User>();
  jdbcDao.getJdbcTemplate().query("select * from T_USER", 
                                                     new RowCallbackHandler(){
       @Override
       public void processRow(ResultSet rs) throws SQLException {
           User user = new User();
           user.setId(rs.getInt("N_ID"));
           user.setName(rs.getString("C_NAME"));
           userList.add(user);
       }
   });

? ? ? ? ?3、o