• 写在前面

    spring一直以删繁就简为主旨,所以设计出非常流行的bean管理模式,简化了开发中的Bean的管理,少写了很多重复代码。而JdbcTemplate的设计更令人赞叹,轻量级,可做ORM也可如Jdbc般灵活。而在JdbcTemplate一个类中,蕴含了两种设计模式,阅读之后受益匪浅,今日特此总结。

  • 设计模式基础

    如果硬读,则走火入魔只得皮毛,幸得某篇博客的指点,先对设计模式进行熟悉,了解它的构造,再去阅读,不仅事半功倍还能加强理解。

    jdbcTemplate中蕴含的两个设计模式:流程控制模式、回调模式

    所谓流程控制,就是由父类定义一个方法,方法中蕴含多个流程,把固定的流程私有化,在其中调用,则子类无法对私有化方法进行重写;若将流程进行默认实现,则子类可选择实现;若将流程抽象化,则推迟到子类去实现,也就是定制化实现,呈上代码。

    譬如:煮牛肉,必须先切,腌(必要过程) 热锅放油(默认实现) 下锅炒(定制过程)

public abstract class Father{
//流程 m1->m2->m3
public final void templateMethod(StatementCallback statementCallback){
method1();
method2();
//抽象方法 子类负责实现 通常为业务
statementCallback.method3();//由接口提供
}
//父类私有方法 不能重写 流程控制
private void method1(){
System.out.println("father private method, control by father ");
}
//钩子方法 可实现 父类提供默认实现
public void method2(){
System.out.println("default method,prevent by father");
} }

    如上类,清晰的流程模型,基于method2定制化实现。这个设计模式有什么好处呢?

    在我们刚学习jdbc的时候,最常见的代码,莫过于。

    String  driver="com.mysql.jdbc.Driver";
Connection con;
String url="jdbc:mysql://localhost:3306/demo";
String user="root";
String pwd="12345";
//连接上数据库mysql
public void connection2MYSQL()
{
try {
Class.forName(driver); con=DriverManager.getConnection(url,user,pwd); if(!con.isClosed())
System.out.println("连接成功"); } catch (Exception e) {
e.printStackTrace();
}
}

    在反反复复的写流程之后,设计者意识到这种无用功减慢效率,必须使用一种设计模式来让程序员注意力更多得关注到更有价值的事情之上,所以这种固定流程,就纳入了流程中父类定义,并且不能修改的范围内。

    第二种设计模式,回调模式。

    在现代互联网随处可见回调,这就是多态性的好处之一,只要需要,就可以定制,诸如

$("#button").click(function(){
//logic
});

    这种回调模式,在程序设计中大受欢迎,如果加上异步,则就是异步回调模型。它受欢迎的原因,就是定制化。而Java中,构建回调模式只需要定义如下接口,并结合上述流程模式。

public interface StatementCallback {
public void method3();
}

    所谓的定制,就是:等我需要的时候再叫你

public class Son extends Father{
public void method3(){
System.out.println("implement by son");
}
} public class Main {
public static void main(String[] args){
Father patten = new Son();
patten.templateMethod(new StatementCallback() {
@Override
public void method3() {
System.out.println("implement by user,callback");
}
});
}
}
  • 源码剖析

    它的各个方法最后都转发到此方法来,此方法整体就是申请连接,执行sql,拿到结果,最后释放连接,在红色标注的地方就是定制化的体现。它封装了很多个上层方法,比如queryForList,queryForMap,都是返回它封装的数据结构。而最底层的流程就是上述方法。

    它提供默认实现的方式是匿名内部类。

    excute是为了执行sql而设计的,而里面的query方法和update则就是为了读写分别设计的了。

    用过的人都知道,update返回int表示它操作的affects数目,而jdbc流行的一种返回主键的做法,就是在update中实现一个返回主键的逻辑,它用到的这个接口就是。

    下面代码重写了回调接口,使其返回插入的主键。

        int col = 0;
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
PreparedStatement ps = con.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
return ps;
}
}, keyHolder);
col = keyHolder.getKey().intValue();

    其余接口未细读,而对于jdbc来说,无非就是读写,我们平常使用的是List和Map,它也可以封装Object,充当小型ORM,它以优秀的设计模式使得数据库操作层的业务设计变得非常简单清晰,并且它优秀的泛型处理技术,也是令人叹为观止。

     

Spring JdbcTemplate源码阅读报告的更多相关文章

  1. spring jdbcTemplate源码剖析

    本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...

  2. Spring事务源码阅读笔记

    1. 背景 本文主要介绍Spring声明式事务的实现原理及源码.对一些工作中的案例与事务源码中的参数进行总结. 2. 基本概念 2.1 基本名词解释 名词 概念 PlatformTransaction ...

  3. spring jdbctemplate源码跟踪

    闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建statement或者preparedStateement ...

  4. Spring框架源码阅读之Springs-beans(一)容器的基本实现概述(待续)

    去年通过实际框架代码的阅读,以及结合<Spring源码深度解析>和<Spring技术内幕>的阅读,对Spring框架内Bean模块有了一个整体性的认识.对此进行的总结性整理和回 ...

  5. 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)

    Starting from a joke 问:把大象放冰箱里,分几步? 答:三步啊,第一.把冰箱门打开,第二.把大象放进去,第三.把冰箱门带上. 问:实现Spring事务,分几步? 答:三步啊,第一. ...

  6. Spring,tk-mapper源码阅读

    Mybatis的源码学习(一): 前言: 结合spring本次学习会先从spring-mybatis开始分析 在学习mybatis之前,应该要对spring的bean有所了解,本文略过 先贴一下myb ...

  7. Spring源码阅读系列总结

    最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...

  8. 搞清楚Spring事件机制后:Spring的源码看起来简单多了

    本文主讲Spring的事件机制,意图说清楚: 什么是观察者模式? 自己实现事件驱动编程,对标Spring的事件机制 彻底搞懂Spring中的事件机制,从而让大家 本文内容较长,代码干货较多,建议收藏后 ...

  9. Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)

    我们到底能走多远系列(33) 扯淡: 各位:    命运就算颠沛流离   命运就算曲折离奇   命运就算恐吓着你做人没趣味   别流泪 心酸 更不应舍弃   ... 主题: Spring源码阅读还在继 ...

随机推荐

  1. 使用PrintWriter out=response.getWriter();输出script脚本时乱码解决

    使用PrintWriter out=response.getWriter();输出script脚本时乱码解决 最近遇到了一个奇怪的事情,仅仅用out.print("<script ty ...

  2. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  3. UVa 11992 Fast Matrix Operations (线段树,区间修改)

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

  4. day3之装饰器

    1.什么是装饰器? #在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证 2.装饰器的形成过程 # 需求写一个函数测试另一个函数的执行效率 最初的实现方式,但是改变 ...

  5. (并查集)How Many Tables -- HDU --1213

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. vc中使用SendMessage正确发送自定义消息的方法

    最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有 一个能完全做出来的.要知道VC编程有一个小地方出错,都 ...

  7. Hdu1896 Stones(优先队列) 2017-01-17 13:07 40人阅读 评论(0) 收藏

    Stones Time Limit : 5000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submis ...

  8. Win7_Ultimate + VS2010 + openGL_MFC单文档应用开发框架搭建步骤

    Win7_Ultimate + VS2010 + openGL单文档应用开发框架搭建步骤 上一个配置是基于OpenGL的开发工具配置的,下面就是基于Vs2010的MFC单文档应用开发. 通过网上查找资 ...

  9. 快速掌握Java中Lambda表达式的用法

    Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...

  10. poj1836 Alignment

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11707   Accepted: 3730 Descri ...