模板方法与回调函数

还记得在刚开始学习JDBC时,每一次SQL执行都要经历从连接的获取、执行SQL、获取结果等,这些是一个流程性的动作。在大二时,刚刚学会没多久后,当时我正在学习JSP、Servlet(我的Java是自学的),有一个高中的同学让我帮她做课程设计。现在还依旧记得,那是一个校园一卡通项目,功能很少,整个课程设计涉及到了10多个SQL语句。

我当时写代码时,把所有的SQL语句都写在了一个Java文件中。每一个SQL语句的执行都要经历:

复制代码

// 获取连接

Connection conn=getConnection();// 自定义的

// 获取语句

PreparedStatement psmt=conn.prepareStatement(sql);

// 设置参数

// ....

// SQL 执行

psmt.executeUpdate或者psmt.executeQuery

// 获取结果

// 从ResultSet中取数

// 关闭连接

close()

复制代码

当代码写了400多行时,我就感觉到这样写太麻烦了,有没有一个模板来处理这个过程呀,这样写下去太麻烦了,这是我当时的真实想法。

我就在想能不能把这个烦人的过程放到一个模板里呢?不同的地方只有SQL执行和结果是如何处理,前面的过程都是一样的。那么我把SQL执行与结果处理拿出来,整个过程的其他部分不变,应该是可以的吧。可以使用抽象类来完成这个功能。

当时想到的是:

public abstract class JDBCTemplate {

private String url;

private String driver;

private String user;

private String password;

protected Connection conn;

public JDBCTemplate(){

}

public JDBCTemplate(String driver, String url, String user, String password){

this.driver=driver;

this.url=url;

this.user=user;

this.password=password;

}

getter, setter就不粘出来了。

public Connection getConnection(){

try {

Class.forName(driver);

conn=DriverManager.getConnection(url, user, password);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

public void close(PreparedStatement statement) throws Exception{

if (statement!=null){

statement.close();

}

if(conn!=null){

conn.close();

}

}

protected final Object template(String sql, Object[] params){

conn=getConnection();

PreparedStatement psmt=null;

try{

psmt=conn.prepareStatement(sql);

for (int i=0; i

psmt.setObject(i+1, params[i]);

}

return executeAndGetResult(psmt);

}catch (Exception e){

e.printStackTrace();

return e;

}

finally {

try{

close(psmt);

}catch (Exception e){

e.printStackTrace();

}

}}

public abstract Object executeAndGetResult(PreparedStatement psmt);

}

复制代码

这样一来,executeAndGetRresult就由子类来完成,并且也不用再写那些烦人的过程了。当时的我,并不知道,这样写其实就是应用了模板方法模式。

=============================================================

再后来,在学习AJax时,通过网上知道一种函数:callback,回调函数,也成为钩子函数。当时对此并不了解,上网查询学习,多多少少对回调函数有种模糊的概念。当时我想到了我之前写的那个JDBCTemplate,能否使用Callback来调整代码呢?

于是我改造了代码:

复制代码

// 添加了一个回调接口

public interface ResultSetHandler {

public Object handle(PreparedStatement statement);

}

//对模板方法接口做如下调整:

protected final Object template(String sql, Object[] params, ResultSetHandler handler){

Connection conn=getConnection();

PreparedStatement psmt=null;

try{

psmt=conn.prepareStatement(sql);

for (int i=0; i

psmt.setObject(i+1, params[i]);

}

return handler.handle(psmt);

}catch (Exception e){

e.printStackTrace();

return e;

}

finally {

try{

close(psmt);

}catch (Exception e){

e.printStackTrace();

}

}

}

复制代码

也就是说,整个调整只换了template方法中的一句:由executeAndGetResult(psmt)调整为handler.handle(psmt);

并把tempalte的abstract去掉了。调整后,感觉这种方式比第一种更好,只是当时的我依旧不知道什么是模板方法模式。我只知道,这样写挺好的,感觉心里很爽。于是我把这个类一直保留着,尽管后来没有使用它。

http://www.dengb.com/Javabc/859806.htmlwww.dengb.comtruehttp://www.dengb.com/Javabc/859806.htmlTechArticle模板方法与回调函数 还记得在刚开始学习JDBC时,每一次SQL执行都要经历从连接的获取、执行SQL、获取结果等,这些是一个流程性的动作。...

Java模板回调函数,模板方法与回调函数相关推荐

  1. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  2. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  3. Java后端自顶向下方法——过滤器与回调函数

    Java后端自顶向下方法--过滤器与回调函数 (一)回调函数与lambda表达式 在讲过滤器的原理之前,我们先来了解一下什么是回调函数.我们在平时开发中,经常会遇到模块之间的互相调用,调用的方式主要分 ...

  4. java map函数指针_C 函数指针与回调函数

    关于回调函数的一点思考 在 A 函数中将参数与 C 函数传递给 B 函数,B函数调用 C 函数:B 函数调用的动作称为回调,C 函数称为回调函数. 举栗 #include // 回调函数a void ...

  5. 【cocos2d-x从c++到js】12:回调函数1——按键回调

    回调函数是界面交互和接入各种第三方SDK的关键所在,因为回调函数的C++代码是不能自动生成的,一切的一切,都需要手写完成. 比较不错的是,Cocos2d-x引擎对于回调函数提供了完整的包装机制.我们所 ...

  6. 函数指针实现回调函数

    首先说明是函数指针,函数指针,就是一个函数,将其函数名指针化,通过传入指针调用不同的函数 手撸代码一次 #include<stdio.h> void max(int a,int b) { ...

  7. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]

    1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...

  8. php 回调递归,PHP数组函数 array_walk_recursive (使用回调函数递归遍历数组元素)

    在PHP中,数组函数 array_walk_recursive () 使用回调函数递归遍历数组元素. 函数语法:array_walk_recursive ( array &$array , c ...

  9. php数组回调函数,PHP:使用回调函数处理数组的函数

    使用回调函数处理数组的函数: 1.array_filter(); 过滤数组中的值. ** $arr=array(0,'linux',123,'hello',false,array(),'0'); $a ...

  10. 【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )

    文章目录 I . 数据回调函数优先级 II . 数据回调函数 相关内容 III . 采样率 处理细节 IV . 数据回调函数 每次 采样个数 numFrames V . 数据回调函数 缓冲区 ( AA ...

最新文章

  1. linux下配置vnc的方法
  2. html5--1.18 div元素与布局
  3. SQL中object_id函数的用法
  4. github加速-解决GitHub访问速度很慢的问题
  5. next.js 简单使用
  6. Cache替换算法:LRU与LFU的区别
  7. SpringMVC+Json构建基于Restful风格的应用
  8. 实战Spring Boot 2.0系列(一) - 使用Gradle构建Docker镜像
  9. mysql 分库分表中间件 mycat_阿里开源的分布式分库分表中间件之MyCat从入门到放弃...
  10. 两台XP系统电脑用双网卡共享上网操作
  11. vtiger6.0升级汇总
  12. 微信小程序——事件备忘录
  13. 锐捷Linux认证失败,锐捷上网认证常见问题及解决办法
  14. COMSOL电磁仿真案例——感应线圈
  15. 用 Python 快速追踪基金的收益情况 | Python财经实践
  16. 对计算机的磁盘进行维护,电脑硬盘如何进行维护?
  17. 银行IT软件服务的公司 (不包括被收购的企业),统计国内员工人数比较多的企业
  18. web 引入思源字体
  19. 我们都只是一朵浮萍罢了
  20. 关于双字节字符(16 byte)

热门文章

  1. 用于制作app store的截图的工具:Brief Wrapper —— 最便捷的应用商店屏幕快照
  2. RPC(RemoteProcedureCallProtocol)
  3. [原]工欲善其事,必先利其器,记一次处理Oracle Listener挂掉的处理过程
  4. Linux(ubuntu 18.0.4) Java环境安装,环境变量配置
  5. [Python WEB开发] 使用WSGI开发类Flask框架 (二)
  6. 数据库 char nchar varchar nvarchar 区别
  7. Web性能测试工具:http_load安装使用简介
  8. 拓端tecdat|R语言极值理论:希尔HILL统计量尾部指数参数估计可视化
  9. 拓端tecdat|R语言推特twitter网络转发可视化分析
  10. 拓端tecdat|R语言使用马尔可夫链Markov Chain, MC来模拟抵押违约