`
gutou9
  • 浏览: 142758 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Spring 学习 JdbcTemplate,模板模式,回调

阅读更多

先通过一个小例子,简单使用一下。

 

配置文件 applicationContext.xml

 

<beans  default-autowire ="autodetect"> 
     <bean id ="dataSource"  class ="org.apache.commons.dbcp.BasicDataSource">  
         <property name ="driverClassName">  
             <value>oracle.jdbc.driver.OracleDriver</value>  
         </property>  
         <property name ="url">  
             <value>jdbc:oracle:thin:@localhost:1521:orcl</value> 
          </property> 
         <property name="username"> 
             <value>username</value> 
         </property> 
         <property name="password"> 
             <value>password</value> 
         </property> 
         <property name="maxActive"> 
             <value>10</value> 
         </property> 
         <property name="maxIdle"> 
             <value>2</value> 
         </property> 
     </bean> 

     <bean id ="JdbcTemplate"
         class ="org.springframework.jdbc.core.JdbcTemplate"> 
         <property name ="dataSource"> 
             <ref bean ="dataSource"  /> 
         </property> 
     </bean> 
 </beans> 

 

程序

	public static void main(String[] args) {
		
		ClassPathResource res = new ClassPathResource("applicationContext.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
		JdbcTemplate jdbcTemplate = (JdbcTemplate) factory
				.getBean("JdbcTemplate");
	 
		jdbcTemplate
				.update("delete from TB_USER where ID= 466 ");
	}

 

只需要一句代码,  就完成了我们关心的 jdbc 操作。

 

F3,看下 jdbcTemplate.update 的实现,

 

	public int update(final String sql) throws DataAccessException {
		Assert.notNull(sql, "SQL must not be null");
		if (logger.isDebugEnabled()) {
			logger.debug("Executing SQL update [" + sql + "]");
		}

		class UpdateStatementCallback implements StatementCallback, SqlProvider {
			public Object doInStatement(Statement stmt) throws SQLException {
				int rows = stmt.executeUpdate(sql);
				if (logger.isDebugEnabled()) {
					logger.debug("SQL update affected " + rows + " rows");
				}
				return new Integer(rows);
			}
			public String getSql() {
				return sql;
			}
		}
		return ((Integer) execute(new UpdateStatementCallback())).intValue();
	}

 

	public Object execute(StatementCallback 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);
			}
			Object result = action.doInStatement(stmtToUse);
			handleWarnings(stmt.getWarnings());
			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());
		}
	}

这里就用到了 Template 设计模式,估计Spring 的这个模块叫 JdbcTemplate 的原因也在于此。

 

 action.doInStatement(stmtToUse);

 执行主体逻辑,

 

 至于 之后的 catch,finally 等,都是无聊又必须有的 开闭Connection 之类的操作,

 Spring 把他们固定成模板代码,都不用动他们了,

 只需实现Spring 留给我们的一句 :  action.doInStatement(stmtToUse) 

 

 Spring 是使用 Java 回调 实现的。

 

update 方法里, 初始化了一个类, UpdateStatementCallback ,

UpdateStatementCallback  里,doInStatement 方法里,就是要执行的主体代码,

但 update 方法并没有直接调用doInStatement ,

而是把 整个UpdateStatementCallback  作为参数,传给了 execute 方法,

再由 execute 调用 UpdateStatementCallback   的 doInStatement ,

 

很绕,总结一下就是,A 里边有个B,A委托C调用自己的B,

 那为什么A自己不调呢,上边的例子就是一个原因,

A 是我们负责写的类,C 是Spring,

因为 调用B 之前和之后 要做额外操作, 是很烦的工作,所以A就把活推给C了

 

 

 

 

 

 

 

 

5
0
分享到:
评论
1 楼 yepeiwen520 2009-09-24  
看来之后,好像有点明白了。模式在框架中应用好多啊

相关推荐

    【转】Spring中模板模式和回调模式的讲解

    在Spring框架中,模板模式和回调模式是两种重要的设计模式,它们被广泛应用于处理各种不同的任务,如数据访问、远程调用等。这两种模式都旨在提高代码的可扩展性和复用性,使得开发者能够以更加灵活的方式处理业务...

    59丨模板模式(下):模板模式与Callback回调函数有何区别和联系?1

    `JdbcTemplate`执行SQL查询时,会调用用户提供的回调方法来处理结果集,这类似于同步回调,因为结果处理在查询完成后立即进行,与模板模式的应用场景相似。 总的来说,回调函数和模板模式都是为了实现代码的复用和...

    Spring-JdbcTemplate

    - **JdbcTemplate**:作为 Spring 对 JDBC 的包装,它提供了一系列的模板方法和回调接口,用于执行 SQL 语句,并对异常进行了统一处理。 ### 2. JdbcTemplate 的主要功能 - **查询**:支持简单的 SQL 查询,预编译...

    Spring JdbcTemplate api

    在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...

    spring模板模代码

    下面将详细探讨Spring模板模式的原理、应用以及接口回调的概念。 **模板模式** 是一种行为设计模式,它定义了算法的骨架,并允许在特定步骤中延迟或定制某些行为。在Spring框架中,模板类通常负责执行网络请求、...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java对象。`JdbcTemplate`提供了事务管理、异常转换等特性,避免了手动处理数据库连接、关闭资源等繁琐工作,提高了代码的可读性和可维护性...

    SSH笔记-Spring JdbcTemplate

    4. **事务管理**:Spring的JdbcTemplate也整合了事务管理功能,通过`JdbcTemplate.execute()`方法的回调函数,可以在一个操作中包裹多个数据库操作,确保原子性和一致性。如果发生异常,事务会自动回滚,否则在所有...

    Spring4--3.jdbcTemplate事务

    文件`spring_3_1`、`spring_3`和`spring_3_2`可能包含了Spring框架关于JdbcTemplate和事务管理的更多示例代码和配置信息,学习这些资源有助于深入理解Spring4中如何有效地利用JdbcTemplate进行事务控制。通过实践,...

    Spring jdbctemplate + mysql 分页封装

    JdbcTemplate是Spring提供的一个模板类,用于执行SQL语句,它通过回调模式简化了数据访问层的编写。在使用JdbcTemplate时,我们需要配置数据库连接信息,创建JdbcTemplate实例,然后调用其提供的方法执行SQL。 在...

    Spring持久化模板总结

    4. **回调机制**:HibernateTemplate提供了doInHibernate()和doInTransaction()等方法,允许用户自定义回调函数,进行更复杂的数据库操作。 **JdbcDaoSupport和HibernateDaoSupport** 这两个类是Spring提供的一般...

    jdbcTemplate

    6. **回调接口**:通过`PreparedStatementCreator`和`ResultSetExtractor`等回调接口,用户可以在不修改`JdbcTemplate`核心逻辑的情况下定制SQL执行和结果处理。 7. **执行效率**:由于`JdbcTemplate`会缓存预编译...

    jdbcTemplate的jar包.rar

    2. **模板方法模式**:JdbcTemplate采用了设计模式中的模板方法模式,预先定义了一系列数据库操作的基本步骤,如执行SQL查询、更新、调用存储过程等,用户只需关注具体的SQL语句和参数即可。 3. **事务管理**:...

    Spring源代码解析(三):Spring_JDBC.doc

    总的来说,Spring JDBC的JdbcTemplate是Spring框架中用于数据库操作的关键组件,通过回调接口和模板方法设计,它极大地简化了数据库访问的代码,同时也提供了良好的异常处理和资源管理机制。理解和掌握JdbcTemplate...

    Spirng-JdbcTemplate资料.docx

    JdbcTemplate通过一系列的模板方法和回调机制,使得数据库操作变得简洁且易于测试。 在传统的JDBC操作中,执行一个简单的更新操作可能需要编写大量的样板代码,包括建立连接、创建Statement或PreparedStatement、...

    JdbcTemplate.jar

    JdbcTemplate是Spring提供的一个模板类,它是基于JDBC但又对JDBC进行了高度封装,旨在减少数据库访问时的繁琐代码,如打开和关闭连接、处理结果集等。它通过预编译的SQL语句、批处理以及异常转换等功能,实现了...

    spring-jdbc源码

    通过使用模板方法设计模式,Spring-JdbcTemplate能够在不牺牲灵活性的同时,保证了代码的简洁性和可维护性。 接着,让我们来看看DataSourceTransactionManager,它是Spring提供的事务管理器,主要用于管理基于...

    JDBCTemplate相关jar包4.3.7

    这些方法都支持回调接口,可以自定义参数绑定和结果处理逻辑。 4. **事务管理**:JDBCTemplate自动管理事务,可以通过配置@Transactional注解或编程式控制来开启和提交事务。在发生异常时,它会自动回滚事务,确保...

    JdbcTemplate

    `JdbcTemplate`是模板方法设计模式的一个实例,将数据库操作的通用流程封装在模板类中,而具体的数据库操作(如SQL语句的执行)则由子类或者回调接口来实现。这种设计降低了代码的耦合度,使得扩展和维护变得更加...

Global site tag (gtag.js) - Google Analytics