我们做过的很多项目中都会使用spring的JdbcTemplate进行结果集的查询操作,以前在使用的时候一直都是“拿来主义”,功能实现了就OK了,没有深究什么内容,特别是查询接口的回调内容方法,没有过多的研究过细节内容。最近一次使用JdbcTemplate进行查询操作,发现了一些有规律的内容,所以就深入学习了一下。和大家一起探讨一下:
对于spring的JdbcTemplate进行结果集查询操作,spring给我们开发的是一系列的query方法,这些查询的方法中回调的接口主有三种:ResultSetExtractor,RowCallbackHandler,RowMapper,这个内容有图有真相:
但是这三种回调接口具体的用法和区别,我们一起来看一下:
场景设定,数据库中存在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、org.springframework.jdbc.core.RowMapper
RowMapper接口中定义的方法如下:
public interface RowMapper { Object mapRow(ResultSet rs, int rowNum) throws SQLException; }
如果使用RowMapper接口作为回调方法,查询方式如下:
List<User> userList = (List<User>)jdbcDao.getJdbcTemplate(). query("select * from T_USER", new RowMapper(){ @Override public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { User user = new User(); user.setId(rs.getInt("N_ID")); user.setName(rs.getString("C_NAME")); return user; } });
通过以上的例子我们可以看出,使用三种回调接口主要的区别是:
1、使用三种Callback接口作为参数的query方法的返回值不同:
以ResultSetExtractor作为方法参数的query方法返回Object型结果,要使用查询结果,我们需要对 其进行强制转型;
以RowMapper接口作为方法参数的query方法直接返回List型的结果;
以RowCallbackHandler作为方法参数的query方法,返回值为void;
2、使用ResultSetExtractor作为Callback接口处理查询结果,我们需要自己声明集合类,自己遍历 ResultSet,自己根据每行数据组装Customer对象,自己将组装后的Customer对象添加到集合类 中,方法最终只负责将组装完成的集合返回。
对于这三个回调接口的区别,spring的官方文档给出的说明是这样描述的:
Note: In contrast to a RowCallbackHandler, a ResultSetExtractor object is typically stateless and thus reusable, as long as it doesn't access stateful resources (such as output streams when streaming LOB contents) or keep result state within the object.
Consider using a RowMapper instead if you need to map exactly one result object per row, assembling them into a List.
Alternatively, consider subclassing MappingSqlQuery from the jdbc.object package: Instead of working with separate JdbcTemplate and RowMapper objects, you can build executable query objects (containing row-mapping logic) in that style.
通过spring的文档描述我们可以知道:
1、RowMapper应该就是一个精简版的ResultSetExtractor,RowMapper能够直接处理一条结果集内容,而ResultSetExtractor需要我们自己去ResultSet中去取结果集的内容,但是ResultSetExtractor拥有更多的控制权,在使用上可以更灵活;
2、与RowCallbackHandler相比,ResultSetExtractor是无状态的,他不能够用来处理有状态的资源。
备注:在spring3中,这三个接口的内容也做出了修改,其中:ResultSetExtractor和RowMapper开始支持泛型,返回值的内容也是泛型中的对象,而RowCallbackHandler没有做出任何修改。
相关推荐
本主题将深入探讨Spring框架中的JdbcTemplate组件,以及模板模式和回调机制的概念。 **1. Spring JdbcTemplate** JdbcTemplate是Spring提供的一个用于简化数据库操作的API,它是Spring对JDBC(Java Database ...
在Spring框架中,`JdbcTemplate`是一个用于简化JDBC编程的工具类,它采用了模板模式来分离数据库访问中的不变和可变部分,提供了一种更加健壮且易于使用的数据访问机制。`JdbcTemplate`负责处理资源的获取、关闭以及...
本篇文章将详细讲解`jdbcTemplate`的预编译使用,以及如何通过回调方法进行定制化的数据处理。 首先,`jdbcTemplate`的核心功能是通过预编译的SQL语句(PreparedStatement)来执行数据库操作。预编译SQL可以有效...
JdbcTemplate是Spring提供的一个模板类,用于执行SQL语句,它通过回调模式简化了数据访问层的编写。在使用JdbcTemplate时,我们需要配置数据库连接信息,创建JdbcTemplate实例,然后调用其提供的方法执行SQL。 在...
4. **事务管理**:Spring的JdbcTemplate也整合了事务管理功能,通过`JdbcTemplate.execute()`方法的回调函数,可以在一个操作中包裹多个数据库操作,确保原子性和一致性。如果发生异常,事务会自动回滚,否则在所有...
- **JdbcTemplate**:作为 Spring 对 JDBC 的包装,它提供了一系列的模板方法和回调接口,用于执行 SQL 语句,并对异常进行了统一处理。 ### 2. JdbcTemplate 的主要功能 - **查询**:支持简单的 SQL 查询,预编译...
它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java对象。`JdbcTemplate`提供了事务管理、异常转换等特性,避免了手动处理数据库连接、关闭资源等繁琐工作,提高了代码的可读性和可维护性...
文件`spring_3_1`、`spring_3`和`spring_3_2`可能包含了Spring框架关于JdbcTemplate和事务管理的更多示例代码和配置信息,学习这些资源有助于深入理解Spring4中如何有效地利用JdbcTemplate进行事务控制。通过实践,...
1. **ORM化回调操作**:`JdbcTemplate`提供了多种方法将查询结果转换为对象列表,这对于复杂的业务逻辑非常有用。 ```java List<User> users = jdbcTemplate.query("SELECT * FROM user", new UserRowMapper());...
在Spring框架中,模板模式和回调模式是两种重要的设计模式,它们被广泛应用于处理各种不同的任务,如数据访问、远程调用等。这两种模式都旨在提高代码的可扩展性和复用性,使得开发者能够以更加灵活的方式处理业务...
JdbcTemplate主要提供以下五类方法;JdbcTemplate类支持的回调类;并附例子
6. **回调接口**:通过`PreparedStatementCreator`和`ResultSetExtractor`等回调接口,用户可以在不修改`JdbcTemplate`核心逻辑的情况下定制SQL执行和结果处理。 7. **执行效率**:由于`JdbcTemplate`会缓存预编译...
除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。
JdbcTemplate提供了一种简单、安全的方式来执行SQL语句,避免了手动处理数据库连接、预编译语句、结果集等繁琐工作,从而降低了出错的可能性。本压缩包“jdbcTemplate的jar包.rar”包含了使用Spring的JdbcTemplate所...
6. **处理结果**:通过回调接口或集合进行结果处理。 四、JdbcTemplate核心方法 - **query()**:用于执行查询操作,返回结果通常为ResultSet。 - **queryForList()**:执行查询并返回结果列表,适合结果集较小的...
在Spring框架中,Spring JDBC是核心模块之一,它提供了一种简单且强大的方式来处理数据库交互。本篇文章将深入解析Spring JDBC的实现,特别是JdbcTemplate类。JdbcTemplate是Spring为简化数据库操作而设计的一个模板...
**JdbcTemplate**是Spring框架中的一个核心组件,主要用于简化Java数据库连接(JDBC)操作,提供了对JDBC的抽象和模板方法,使得开发者能够以一种更安全、更易用、更少错误的方式来处理数据库交互。它通过消除大量...
Java中的JdbcTemplate是Spring框架提供的一种用于简化JDBC(Java Database Connectivity)操作的工具,它在数据持久层操作中扮演着重要角色。JdbcTemplate通过消除大量重复的JDBC样板代码,提高了代码的可读性和可...
它提供了一种模板化的JDBC访问方式,使得开发者可以避免直接与JDBC API进行交互,从而减少代码量、提高可读性和可维护性。在Java应用开发中,尤其是在企业级应用中,JDBCTemplate扮演了重要的角色,因为它提供了事务...