先通过一个小例子,简单使用一下。
配置文件 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了。
分享到:
相关推荐
在Spring框架中,模板模式和回调模式是两种重要的设计模式,它们被广泛应用于处理各种不同的任务,如数据访问、远程调用等。这两种模式都旨在提高代码的可扩展性和复用性,使得开发者能够以更加灵活的方式处理业务...
- **JdbcTemplate**:作为 Spring 对 JDBC 的包装,它提供了一系列的模板方法和回调接口,用于执行 SQL 语句,并对异常进行了统一处理。 ### 2. JdbcTemplate 的主要功能 - **查询**:支持简单的 SQL 查询,预编译...
`JdbcTemplate`执行SQL查询时,会调用用户提供的回调方法来处理结果集,这类似于同步回调,因为结果处理在查询完成后立即进行,与模板模式的应用场景相似。 总的来说,回调函数和模板模式都是为了实现代码的复用和...
在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...
下面将详细探讨Spring模板模式的原理、应用以及接口回调的概念。 **模板模式** 是一种行为设计模式,它定义了算法的骨架,并允许在特定步骤中延迟或定制某些行为。在Spring框架中,模板类通常负责执行网络请求、...
它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java对象。`JdbcTemplate`提供了事务管理、异常转换等特性,避免了手动处理数据库连接、关闭资源等繁琐工作,提高了代码的可读性和可维护性...
4. **事务管理**:Spring的JdbcTemplate也整合了事务管理功能,通过`JdbcTemplate.execute()`方法的回调函数,可以在一个操作中包裹多个数据库操作,确保原子性和一致性。如果发生异常,事务会自动回滚,否则在所有...
文件`spring_3_1`、`spring_3`和`spring_3_2`可能包含了Spring框架关于JdbcTemplate和事务管理的更多示例代码和配置信息,学习这些资源有助于深入理解Spring4中如何有效地利用JdbcTemplate进行事务控制。通过实践,...
JdbcTemplate是Spring提供的一个模板类,用于执行SQL语句,它通过回调模式简化了数据访问层的编写。在使用JdbcTemplate时,我们需要配置数据库连接信息,创建JdbcTemplate实例,然后调用其提供的方法执行SQL。 在...
4. **回调机制**:HibernateTemplate提供了doInHibernate()和doInTransaction()等方法,允许用户自定义回调函数,进行更复杂的数据库操作。 **JdbcDaoSupport和HibernateDaoSupport** 这两个类是Spring提供的一般...
6. **回调接口**:通过`PreparedStatementCreator`和`ResultSetExtractor`等回调接口,用户可以在不修改`JdbcTemplate`核心逻辑的情况下定制SQL执行和结果处理。 7. **执行效率**:由于`JdbcTemplate`会缓存预编译...
2. **模板方法模式**:JdbcTemplate采用了设计模式中的模板方法模式,预先定义了一系列数据库操作的基本步骤,如执行SQL查询、更新、调用存储过程等,用户只需关注具体的SQL语句和参数即可。 3. **事务管理**:...
总的来说,Spring JDBC的JdbcTemplate是Spring框架中用于数据库操作的关键组件,通过回调接口和模板方法设计,它极大地简化了数据库访问的代码,同时也提供了良好的异常处理和资源管理机制。理解和掌握JdbcTemplate...
JdbcTemplate通过一系列的模板方法和回调机制,使得数据库操作变得简洁且易于测试。 在传统的JDBC操作中,执行一个简单的更新操作可能需要编写大量的样板代码,包括建立连接、创建Statement或PreparedStatement、...
JdbcTemplate是Spring提供的一个模板类,它是基于JDBC但又对JDBC进行了高度封装,旨在减少数据库访问时的繁琐代码,如打开和关闭连接、处理结果集等。它通过预编译的SQL语句、批处理以及异常转换等功能,实现了...
通过使用模板方法设计模式,Spring-JdbcTemplate能够在不牺牲灵活性的同时,保证了代码的简洁性和可维护性。 接着,让我们来看看DataSourceTransactionManager,它是Spring提供的事务管理器,主要用于管理基于...
这些方法都支持回调接口,可以自定义参数绑定和结果处理逻辑。 4. **事务管理**:JDBCTemplate自动管理事务,可以通过配置@Transactional注解或编程式控制来开启和提交事务。在发生异常时,它会自动回滚事务,确保...
`JdbcTemplate`是模板方法设计模式的一个实例,将数据库操作的通用流程封装在模板类中,而具体的数据库操作(如SQL语句的执行)则由子类或者回调接口来实现。这种设计降低了代码的耦合度,使得扩展和维护变得更加...