分别构建三个参数:
PreparedStatementCreator :对PreparedStatement进行创建
PreparedStatementSetter :对PreparedStatement进行赋值
ResultSetExtractor :对ResultSet结果进行处理
1.对PreparedStatement进行创建
private static class SimplePreparedStatementCreator implements PreparedStatementCreator, SqlProvider
SimplePreparedStatementCreator 包装了用户传来的sql语句。
创建PreparedStatement对象的主要方法:
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
return con.prepareStatement(this.sql);
}
2.PreparedStatementSetter 的构建,对PreparedStatement进行赋值
class ArgPreparedStatementSetter implements PreparedStatementSetter, ParameterDisposer
ArgPreparedStatementSetter里的核心方法:
public void setValues(PreparedStatement ps) throws SQLException {
if (this.args != null) {
for (int i = 0; i < this.args.length; i++) {
Object arg = this.args[i];
if (arg instanceof SqlParameterValue) {
SqlParameterValue paramValue = (SqlParameterValue) arg;
StatementCreatorUtils.setParameterValue(ps, i + 1, paramValue, paramValue.getValue());
}
else {
StatementCreatorUtils.setParameterValue(ps, i + 1, SqlTypeValue.TYPE_UNKNOWN, arg);
}
}
}
}
3.ResultSetExtractor的构建,对ResultSet结果进行处理:
ParameterizedRowMapper<T> extends RowMapper
RowMapperResultSetExtractor implements ResultSetExtractor
RowMapperResultSetExtractor 对RowMapper进行了包装,RowMapperResultSetExtractor 里的核心方法:
public Object extractData(ResultSet rs) throws SQLException {
List results = (this.rowsExpected > 0 ? new ArrayList(this.rowsExpected) : new ArrayList());
int rowNum = 0;
while (rs.next()) {
results.add(this.rowMapper.mapRow(rs, rowNum++));
}
return results;
}
从extractData方法里可以看出,最后
回调的是RowMapper里的方法mapRow,所以我们可以对这个方法进行实现。
例如:
class MyRowMapper implements ParameterizedRowMapper<Child> {
public Child mapRow(ResultSet resultSet, int i) throws SQLException {
ParentManager mgr = (ParentManager) Platform.getInstance().getBean(ParentManager.BEAN_ID);
Child child = new Child();
child.setId(resultSet.getString("id"));
child.setName(resultSet.getString("name"));
child.setContent(resultSet.getString("content"));
child.setParent(mgr.get(resultSet.getLong("parentid")));
return child;
}
}
三个对象构建出来以后,最后会调用方法:
public Object query(
PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse)
public Object query(
PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse)
throws DataAccessException {
Assert.notNull(rse, "ResultSetExtractor must not be null");
logger.debug("Executing prepared SQL query");
return execute(psc, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps) throws SQLException {
ResultSet rs = null;
try {
if (pss != null) {
//对PreparedStatement 的参数进行设置
pss.setValues(ps);
}
rs = ps.executeQuery();
ResultSet rsToUse = rs;
if (nativeJdbcExtractor != null) {
rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
}
//对ResultSet结果进行处理,最终返回一个List集合对象
return rse.extractData(rsToUse);
}
finally {
JdbcUtils.closeResultSet(rs);
if (pss instanceof ParameterDisposer) {
((ParameterDisposer) pss).cleanupParameters();
}
}
}
});
}
分享到:
相关推荐
《Spring JDBC源码深度解析与应用实践》 在Java领域,Spring框架以其强大的功能和灵活的设计,成为企业级开发的首选。Spring JDBC模块是Spring框架的重要组成部分,它为开发者提供了简洁、高效的数据库操作方式,...
Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...
《Spring5 源码分析(第 2 版)》是针对Spring框架第五个主要版本的深度解析著作,由知名讲师倾心打造,旨在帮助读者深入理解Spring框架的内部工作机制,提升对Java企业级应用开发的专业技能。本书涵盖了Spring框架的...
Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得开发者可以更方便地使用Java数据库连接(JDBC)来操作数据库。在这个实例源码中,我们看到的是一个基于`epet`宠物项目的完整实现,该项目可能包括了创建...
标签“源码”和“工具”表明这篇博客可能还涉及了Spring JDBC的源码分析,以及一些实用的工具或技巧,如数据库连接池的配置、事务异常处理、事务回滚规则等。 综上,Spring JDBC事务管理是Spring框架中重要的部分,...
4. **源码分析**: - 深入理解Spring JDBC的源码,可以发现它对JDBC的优化主要体现在批处理、结果集处理和事务控制等方面。 - JdbcTemplate通过PreparedStatementCreator和RowCallbackHandler等接口,实现了SQL的...
Spring5源码分析笔记旨在深入理解Spring的工作原理,帮助开发者提升技能,优化代码,以及更好地利用其核心特性。以下是对Spring5源码的一些关键知识点的详细解释: 1. **依赖注入(Dependency Injection,DI)**:...
《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...
标签"源码"提示了可能有对RoutingDataSource源码的分析。Spring的源码是开源的,通过阅读源码,我们可以理解它的内部工作机制,比如如何根据路由键选择数据源,如何处理多个数据源的事务管理等。 "工具"标签则表明...
5. **项目源码分析**:在压缩包中的项目源码,我们可以看到以下几个关键部分: - `web.xml`:配置Spring MVC的DispatcherServlet和ContextLoaderListener。 - `applicationContext.xml`:定义Spring容器的Bean,...
**源码分析**:深入理解Spring JDBC事务管理的源码,可以帮助开发者更好地定制和优化事务处理。关键类如`TransactionDefinition`定义了事务属性,如隔离级别、超时时间等;`TransactionStatus`接口则表示当前事务的...
### Spring源码分析知识点 #### 一、Spring框架概述 Spring框架是一个全面的企业级应用开发框架,它通过一系列模块化的组件来支持不同的应用场景和技术需求。Spring的核心价值在于提供了一种简洁的方式来解决企业...
一阶段 1、Spring概述 2、一切从bean开始 3、俯瞰Spring架构设计 4、Spring源码下载 ...SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 Spring事务源码解析 需要其他源码请私信我
在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...
以上只是Spring源码分析的部分内容,实际源码中还包括Spring的其他模块,如Spring Batch(批处理)、Spring Security(安全)、Spring Integration(集成)等。理解并掌握Spring源码,有助于我们更好地利用Spring...
Spring框架是开源的轻量级Java应用程序框架,主要目标是简化企业级应用程序的开发。它通过一套完整的设计模式和约定,实现了业务...通过深入分析Spring源码,我们可以更好地理解和利用这些功能来优化我们的应用程序。
在这个源码分析中,我们将深入探讨Spring的核心概念、主要组件以及2.5版本的关键变化。 1. **依赖注入(Dependency Injection, DI)** Spring的核心特性之一是依赖注入,它允许开发者通过配置文件或注解来管理对象...
7. **源码分析**:深入理解Spring JDBC的源码有助于我们更好地利用其功能。例如,了解JdbcTemplate如何执行SQL,以及如何处理异常和资源关闭,可以帮助我们编写更高效的代码。 8. **工具的运用**:在实际开发中,...
《Spring源码分析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是许多开发者深入研究的对象。这份"Spring源码分析"资料深入探讨了Spring的核心机制,帮助我们理解其背后的原理,从而...