`
esffor
  • 浏览: 1367461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模板模式在Spring 中的应用

阅读更多

在spring里面我们一般是这样来使用模板模式的:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("UPDATE user SET age = 10 WHERE id = 'erica'");

或者:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate
.update(
"UPDATE user SET age = ? WHERE id = ?",
new PreparedStatementSetter() {
public void setValues(PreparedStatementSetter ps)
throws SQLException {
ps.setInt(1, 18);
ps.setString(2, "erica");
}
}
);

那么具体在spring里面他是怎么运作的呢?

下面以query查询为例:

public class JdbcTemplate extends JdbcAccessor implements JdbcOperations, InitializingBean {

。。。。。。。。。。。。。。。。。。。。。。。。。

protected Object query(
PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse)
throws DataAccessException {
if (logger.isDebugEnabled()) {
String sql = getSql(psc);
logger.debug("Executing SQL query" + (sql != null ? " [" + sql + "]" : ""));
}
return execute(psc, new PreparedStatementCallback() {

//此处以 PreparedStatementCallback 为参数调用 execute()方法,在execute()方法里面回调传入的方法。在回调方法里面即根据传入的 PreparedStatement 执行 查询操作,返回结果。而 PreparedStatement 的获取是在调用回调方法的客户端实现即在execute()方法里面获取,并作为参数传给回调方法。
public Object doInPreparedStatement(PreparedStatement ps) throws SQLException {
ResultSet rs = null;
try {
if (pss != null) {
pss.setValues(ps);
}
if (getFetchSize() > 0) {
ps.setFetchSize(getFetchSize());
}
rs = ps.executeQuery();
ResultSet rsToUse = rs;
if (nativeJdbcExtractor != null) {
rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
}
return rse.extractData(rsToUse);
}
finally {
JdbcUtils.closeResultSet(rs);
if (pss instanceof ParameterDisposer) {
((ParameterDisposer) pss).cleanupParameters();
}
}
}
});
}

那么在execue()方法里面是怎样回调的呢?下面看看execue()方法:

public Object execute(PreparedStatementCreator psc, PreparedStatementCallback action) {
Connection con = DataSourceUtils.getConnection(getDataSource());
PreparedStatement ps = null;
try {
Connection conToUse = con;
if (this.nativeJdbcExtractor != null &&
this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativePreparedStatements()) {
conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
}
ps = psc.createPreparedStatement(conToUse);
DataSourceUtils.applyTransactionTimeout(ps, getDataSource());
PreparedStatement psToUse = ps;
if (this.nativeJdbcExtractor != null) {
psToUse = this.nativeJdbcExtractor.getNativePreparedStatement(ps);
}
Object result = action.doInPreparedStatement(psToUse);
SQLWarning warning = ps.getWarnings();
throwExceptionOnWarningIfNotIgnoringWarnings(warning);
return result;
}
catch (SQLException ex) {
throw getExceptionTranslator().translate(
"executing PreparedStatementCallback [" + psc + "]", getSql(psc), ex);
}
finally {
if (psc instanceof ParameterDisposer) {
((ParameterDisposer) psc).cleanupParameters();
}
JdbcUtils.closeStatement(ps);
DataSourceUtils.closeConnectionIfNecessary(con, getDataSource());
}
}

添加删除的操作类似,只是他们的实现都在以execute命名的方法里面。

public void execute(final String sql) throws DataAccessException {
if (logger.isDebugEnabled()) {
logger.debug("Executing SQL statement [" + sql + "]");
}
class ExecuteStatementCallback implements StatementCallback, SqlProvider {
public Object doInStatement(Statement stmt) throws SQLException {
stmt.execute(sql);
return null;
}
public String getSql() {
return sql;
}
}
execute(new ExecuteStatementCallback());
}

public Object execute(final StatementCallback action) {
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();
DataSourceUtils.applyTransactionTimeout(stmt, getDataSource());
Statement stmtToUse = stmt;
if (this.nativeJdbcExtractor != null) {
stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
}
Object result = action.doInStatement(stmtToUse);
SQLWarning warning = stmt.getWarnings();
throwExceptionOnWarningIfNotIgnoringWarnings(warning);
return result;
}
catch (SQLException ex) {
throw getExceptionTranslator().translate("executing StatementCallback", getSql(action), ex);
}
finally {

//这里就是我们自己写程序的时候需要写的关于数据库链接的关闭操作
JdbcUtils.closeStatement(stmt);
DataSourceUtils.closeConnectionIfNecessary(con, getDataSource());
}
}



 

分享到:
评论

相关推荐

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

    本主题将深入探讨Spring框架中的JdbcTemplate组件,以及模板模式和回调机制的概念。 **1. Spring JdbcTemplate** JdbcTemplate是Spring提供的一个用于简化数据库操作的API,它是Spring对JDBC(Java Database ...

    spring模板模代码

    在Spring框架中,模板模式是一种常见的设计模式,用于简化复杂操作的实现,提供了一种抽象层,使得开发者可以通过实现特定接口来处理不同类型的业务逻辑,而无需关心底层的执行细节。这种模式在Spring中体现得...

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

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

    java设计模式之模板模式

    模板模式是一种行为设计模式,它在Java编程中扮演着重要的角色,主要用来定义算法的骨架,而将一些步骤延迟到子类中。...在实际开发中,合理运用模板模式,可以提高代码的可读性和可维护性,同时也降低了系统的复杂度。

    第四章:Spring AOP API 设计模式1

    11. **模板方法模式(Template Method)**:在Spring AOP中,模板方法模式可能体现在一些基类中,定义了操作的基本步骤,并允许子类在特定步骤中进行扩展。 12. **责任链模式(Chain of Responsibility)**:Spring...

    Spring MVC / Spring Boot中使用Thymeleaf模板引擎

    在Java Web开发中,Spring MVC和Spring Boot框架是广泛使用的工具,它们提供了高效且灵活的构建Web应用的方式。Thymeleaf则是一个流行的服务器端模板引擎,它允许开发者使用HTML来编写视图,并在服务器端解析这些...

    spring+mybatis模板

    Spring 和 MyBatis 是两种非常流行的 Java 开发框架,它们在企业级应用中广泛使用。Spring 是一个全面的后端开发框架,提供了依赖注入、面向切面编程、事务管理等功能,而 MyBatis 是一个轻量级的持久层框架,专注于...

    51-Spring中的设计模式1

    本文主要探讨了静态工厂模式、适配器模式和模板方法模式在Spring中的应用。 首先,静态工厂模式在Spring的IoC(Inversion of Control,控制反转)中起到基础作用。BeanFactory是Spring的核心,它通过静态工厂方法...

    设计模式之模板方法模式

    在实际应用中,模板方法模式常用于框架设计,如Spring框架中的AOP(面向切面编程)就是使用模板方法模式的一个典型例子。开发者可以自定义切面逻辑,而Spring框架负责处理切面的织入和执行时机。 在Java编程中,...

    java模式--模板模式实例代码

    模板模式是一种行为设计模式,它使你能在代码中定义一个操作的不同步骤,并让子类决定这些...在Java编程中,模板模式广泛应用于各种框架和库中,例如Spring MVC的Controller方法执行流程就是一个典型的模板模式应用。

    springcloud模板

    在该模板中,我们可以看到以下几个关键组成部分: 1. **Eureka**:Eureka是SpringCloud中的服务注册与发现组件。在模板中,"eureka"目录下包含了服务注册中心的相关代码。Eureka Server负责维护服务提供者的元数据...

    spring模板方法.zip

    3. **Spring Boot中的设计模式应用**:介绍如何在Spring Boot项目中运用各种设计模式,比如工厂模式、单例模式、观察者模式和策略模式。 4. **代码示例**:通过"mayikt_code"代码库,展示具体实现,帮助理解如何将...

    Java EE设计模式_Spring企业级开发最佳实践-源代码

    本资源包含了Spring框架中常见的设计模式及其在实际项目中的应用实例,这些实例是基于书中可运行的项目源代码。以下是根据标题、描述及标签提炼的相关知识点: 1. **Java EE**:Java Enterprise Edition,是Java...

    spring boot 模板

    Spring Boot 模板是开发Web应用的一个强大工具,它简化了使用各种模板引擎如Thymeleaf、FreeMarker和Mustache等的过程。Thymeleaf是Spring Boot中常用的一款前端模板引擎,它允许开发者在HTML中直接编写动态内容,...

    Spring 框架的设计理念与设计模式分析

    Context组件则是整个Spring应用上下文,它负责管理和协调Bean之间的关系,相当于Bean的生存环境;Beans组件是Spring的核心,它定义了Bean的生命周期和配置,是实现依赖注入(Dependency Injection,DI)的关键。 ...

    Spring 设计模式总结1

    9. **模板方法模式**:Spring的`JdbcTemplate`和`HibernateTemplate`等都运用了模板方法模式,提供一个基本操作流程,允许子类在不改变整体结构的情况下重写部分步骤。 10. **责任链模式**:Spring的异常处理和AOP...

    activemq5.5.1 Spring模板

    本文将深入探讨ActiveMQ 5.5.1版本与Spring框架的集成,以及如何利用Spring的模板模式简化ActiveMQ的使用。 一、ActiveMQ基础介绍 ActiveMQ是Apache软件基金会下的一个项目,遵循JMS(Java消息服务)规范,支持多种...

    设计模式之模板模式

    - 在Java中,很多框架和库都应用了模板模式,如Spring的AOP切面处理、JDBC模板等。 5. **优缺点**: - **优点**:模板模式提供了代码复用,降低了系统的复杂度,同时保持了系统的扩展性。通过子类继承抽象类并...

    spring的设计模式

    Spring 设计模式是软件设计模式在 Spring 框架中的应用,它们解决了软件设计中常见的问题,如工厂方法模式、代理模式、模板方法模式等。这些设计模式的应用使得 Spring 框架更加灵活、可扩展和可维护。 工厂方法...

Global site tag (gtag.js) - Google Analytics