`
ttitfly
  • 浏览: 623947 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring jdbc源码分析

阅读更多
分别构建三个参数:
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.rar源码 学习分析用

    《Spring JDBC源码深度解析与应用实践》 在Java领域,Spring框架以其强大的功能和灵活的设计,成为企业级开发的首选。Spring JDBC模块是Spring框架的重要组成部分,它为开发者提供了简洁、高效的数据库操作方式,...

    spring源码分析(1-10)

    Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...

    Spring5 源码分析(第 2 版) .zip

    《Spring5 源码分析(第 2 版)》是针对Spring框架第五个主要版本的深度解析著作,由知名讲师倾心打造,旨在帮助读者深入理解Spring框架的内部工作机制,提升对Java企业级应用开发的专业技能。本书涵盖了Spring框架的...

    spring jdbc 实例源码

    Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得开发者可以更方便地使用Java数据库连接(JDBC)来操作数据库。在这个实例源码中,我们看到的是一个基于`epet`宠物项目的完整实现,该项目可能包括了创建...

    spring jdbc 事务

    标签“源码”和“工具”表明这篇博客可能还涉及了Spring JDBC的源码分析,以及一些实用的工具或技巧,如数据库连接池的配置、事务异常处理、事务回滚规则等。 综上,Spring JDBC事务管理是Spring框架中重要的部分,...

    Spring与JDBC整合

    4. **源码分析**: - 深入理解Spring JDBC的源码,可以发现它对JDBC的优化主要体现在批处理、结果集处理和事务控制等方面。 - JdbcTemplate通过PreparedStatementCreator和RowCallbackHandler等接口,实现了SQL的...

    spring5源码分析笔记

    Spring5源码分析笔记旨在深入理解Spring的工作原理,帮助开发者提升技能,优化代码,以及更好地利用其核心特性。以下是对Spring5源码的一些关键知识点的详细解释: 1. **依赖注入(Dependency Injection,DI)**:...

    spring高级源码分析

    《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...

    spring-jdbc-RoutingDataSource

    标签"源码"提示了可能有对RoutingDataSource源码的分析。Spring的源码是开源的,通过阅读源码,我们可以理解它的内部工作机制,比如如何根据路由键选择数据源,如何处理多个数据源的事务管理等。 "工具"标签则表明...

    Spring mvc + Spring + Spring jdbc 整合 demo.rar

    5. **项目源码分析**:在压缩包中的项目源码,我们可以看到以下几个关键部分: - `web.xml`:配置Spring MVC的DispatcherServlet和ContextLoaderListener。 - `applicationContext.xml`:定义Spring容器的Bean,...

    spring JDBC事务管理

    **源码分析**:深入理解Spring JDBC事务管理的源码,可以帮助开发者更好地定制和优化事务处理。关键类如`TransactionDefinition`定义了事务属性,如隔离级别、超时时间等;`TransactionStatus`接口则表示当前事务的...

    spring源码分析(一)

    ### Spring源码分析知识点 #### 一、Spring框架概述 Spring框架是一个全面的企业级应用开发框架,它通过一系列模块化的组件来支持不同的应用场景和技术需求。Spring的核心价值在于提供了一种简洁的方式来解决企业...

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    一阶段 1、Spring概述 2、一切从bean开始 3、俯瞰Spring架构设计 4、Spring源码下载 ...SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 Spring事务源码解析 需要其他源码请私信我

    spring 源码中文注释

    在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...

    Spring源码分析

    以上只是Spring源码分析的部分内容,实际源码中还包括Spring的其他模块,如Spring Batch(批处理)、Spring Security(安全)、Spring Integration(集成)等。理解并掌握Spring源码,有助于我们更好地利用Spring...

    Spring源码分析第一阶段

    Spring框架是开源的轻量级Java应用程序框架,主要目标是简化企业级应用程序的开发。它通过一套完整的设计模式和约定,实现了业务...通过深入分析Spring源码,我们可以更好地理解和利用这些功能来优化我们的应用程序。

    spring2.5源码分析

    在这个源码分析中,我们将深入探讨Spring的核心概念、主要组件以及2.5版本的关键变化。 1. **依赖注入(Dependency Injection, DI)** Spring的核心特性之一是依赖注入,它允许开发者通过配置文件或注解来管理对象...

    Spring+JDBC组合开发及环境搭建

    7. **源码分析**:深入理解Spring JDBC的源码有助于我们更好地利用其功能。例如,了解JdbcTemplate如何执行SQL,以及如何处理异常和资源关闭,可以帮助我们编写更高效的代码。 8. **工具的运用**:在实际开发中,...

    Spring源码分析.rar

    《Spring源码分析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是许多开发者深入研究的对象。这份"Spring源码分析"资料深入探讨了Spring的核心机制,帮助我们理解其背后的原理,从而...

Global site tag (gtag.js) - Google Analytics