spring jdbc 查询模板 内部类的使用
感觉这种写法让代码显得很清晰,将固定的操作步骤制定成模板方法,通过使用者,自己来实现继承类来决定操作过程。
org.springframework.jdbc.core.RowMapper
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
org.springframework.jdbc.core.RowMapperResultSetExtractor
public class RowMapperResultSetExtractor<T> implements ResultSetExtractor<List<T>> {
public List<T> extractData(ResultSet rs) throws SQLException {
List<T> results = (this.rowsExpected > 0 ? new ArrayList<T>(this.rowsExpected) : new ArrayList<T>());
int rowNum = 0;
while (rs.next()) {
results.add(this.rowMapper.mapRow(rs, rowNum++));
}
return results;
}
}
以下是模板类的操作过程:
org.springframework.jdbc.core.JdbcTemplate
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
return query(sql, new RowMapperResultSetExtractor<T>(rowMapper));
}
public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {
Assert.notNull(sql, "SQL must not be null");
Assert.notNull(rse, "ResultSetExtractor must not be null");
if (logger.isDebugEnabled()) {
logger.debug("Executing SQL query [" + sql + "]");
}
class QueryStatementCallback implements StatementCallback<T>, SqlProvider {
public T doInStatement(Statement stmt) throws SQLException {
ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
ResultSet rsToUse = rs;
if (nativeJdbcExtractor != null) {
rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
}
return rse.extractData(rsToUse);
}
finally {
JdbcUtils.closeResultSet(rs);
}
}
public String getSql() {
return sql;
}
}
return execute(new QueryStatementCallback());
}
//模板方法
public <T> T execute(StatementCallback<T> action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(getDataSource());
Statement stmt = null;
try {
Connection conToUse = con;
if (this.nativeJdbcExtractor != null &&
this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
}
stmt = conToUse.createStatement();
applyStatementSettings(stmt);
Statement stmtToUse = stmt;
if (this.nativeJdbcExtractor != null) {
stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
}
T result = action.doInStatement(stmtToUse);
handleWarnings(stmt);
return result;
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
JdbcUtils.closeStatement(stmt);
stmt = null;
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
}
finally {
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
分享到:
相关推荐
- **代码简洁性**:通过模板类和回调接口,Spring JDBC减少了大量重复的样板代码,使得数据库操作代码更加简洁明了。 - **事务管理**:集成Spring的事务管理,可以方便地实现事务的传播行为和回滚策略,提升代码的可...
SpringJDBC是Spring框架的一部分,它简化了传统的JDBC编程模型,通过提供模板方法和回调机制,使得数据库操作更加容易。SpringJDBC提供了一层抽象,可以避免大量重复的JDBC代码,如打开和关闭连接、处理结果集等,使...
Spring JDBC支持两种方式执行SQL:模板方法和回调处理器。模板方法直接在`JdbcTemplate`上调用,如`execute(String sql)`;回调处理器则通过提供回调接口(如`PreparedStatementCreator`和`ResultSetExtractor`)让...
总的来说,Spring JDBC的JdbcTemplate是Spring框架中用于数据库操作的关键组件,通过回调接口和模板方法设计,它极大地简化了数据库访问的代码,同时也提供了良好的异常处理和资源管理机制。理解和掌握JdbcTemplate...
本主题将深入探讨Spring框架中的JdbcTemplate组件,以及模板模式和回调机制的概念。 **1. Spring JdbcTemplate** JdbcTemplate是Spring提供的一个用于简化数据库操作的API,它是Spring对JDBC(Java Database ...
Spring JDBC通过一套模板类(如JdbcTemplate)和回调接口(如RowMapper、ResultSetExtractor),将数据库操作与业务逻辑解耦,使得代码更加简洁且易于测试。在本项目中,SpringJDBCTemplate的使用将展示如何在Spring...
例如,你可以使用Scala的函数式编程特性,配合Spring JDBC的回调方法,编写出简洁而强大的数据库操作逻辑。 在压缩包`dwScalaSpringJDBC-master`中,很可能是包含了一个示例项目,演示如何在Scala项目中集成和使用...
它简化了JDBC的配置和使用,通过模板方法和回调机制减少了代码量。Spring JDBC还支持事务管理,使开发者能够轻松处理数据库事务的提交和回滚。 **Maven** Maven 是一个项目管理和综合工具,它帮助开发者管理依赖...
Spring 的 JDBC 支持简化了数据库操作,通过模板方法和回调机制减少了代码量,同时提供了事务管理和数据源管理等高级功能。 JDBC(Java Database Connectivity)是 Java 与数据库交互的标准接口。尽管 Spring 提供...
3. 使用`TransactionTemplate`执行事务:在事务操作中,你可以使用`execute`方法,它接受一个回调函数,所有在这个回调函数中的操作都在事务范围内执行。如果回调函数抛出异常,事务会自动回滚;否则,事务在回调...
除了`JdbcTemplate`,Spring还提供了如`HibernateTemplate`这样的其他模板类,适用于不同的ORM框架,它们同样采用了回调接口的方式,为特定框架的操作提供统一的处理方式。 总的来说,`JdbcTemplate`通过模板方法...
- **JDBC抽象**:简化了数据库操作,通过模板类和回调接口减少代码量。 - **ORM支持**:集成了Hibernate、MyBatis等ORM框架,方便与数据库交互。 - **JPA支持**:提供对Java Persistence API的支持,便于进行对象...
2. **Spring JDBC**:理解 Spring 框架中的 JDBC 模块如何通过提供模板类和回调接口,简化了传统的 JDBC 编程,降低了处理数据库异常和资源管理的复杂性。 3. **MySQL 二进制日志**:学习 MySQL 二进制日志的工作...
6. **回调接口**:通过`PreparedStatementCreator`和`ResultSetExtractor`等回调接口,用户可以在不修改`JdbcTemplate`核心逻辑的情况下定制SQL执行和结果处理。 7. **执行效率**:由于`JdbcTemplate`会缓存预编译...
JdbcTemplate是Spring JDBC的核心组件,它提供了一种模板方法设计模式,将常见的JDBC操作进行了封装,如打开和关闭连接、处理异常、管理事务等,让开发者只需关注SQL语句和结果集的处理。JdbcTemplate支持JDBC 2.0...
`JdbcTemplate`是Spring框架提供的一个用于简化JDBC编程的工具类,它封装了许多常用的数据库操作,如查询、更新等,并且通过模板模式设计,提供了灵活的扩展机制。这使得开发者能够更专注于业务逻辑而非繁琐的JDBC...
Spring提供多种回调方法,如`@PostConstruct`、`@PreDestroy`,以及生命周期接口(InitializingBean、DisposableBean)供开发者定制Bean的初始化和销毁行为。 **Spring Bean的作用域**: Spring Bean有五种作用域...
开发者可以使用模板方法或回调机制执行SQL,方便地进行数据操作。 5. **Spring 声明式事务管理**:Spring提供了声明式事务管理,允许开发者在不写任何事务管理代码的情况下,通过配置实现事务的ACID特性。通过@...
Spring JDBC模块简化了数据库操作,提供了模板和回调机制,而ORM模块则让开发者可以使用对象模型来处理数据库操作,无需关心底层SQL。 在Web开发领域,Spring MVC是Spring Framework的一部分,提供了一个强大的MVC...
3. **Bean的生命周期**:讨论了Spring如何初始化、配置、管理和销毁Bean,包括Bean的实例化、属性设置、初始化回调、销毁回调等阶段。 4. **AOP(Aspect Oriented Programming,面向切面编程)**:Spring的AOP模块...