• 写在前面

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

  • 设计模式基础

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

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

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

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

  1. public abstract class Father{
  2. //流程 m1->m2->m3
  3. public final void templateMethod(StatementCallback statementCallback){
  4. method1();
  5. method2();
  6. //抽象方法 子类负责实现 通常为业务
  7. statementCallback.method3();//由接口提供
  8. }
  9. //父类私有方法 不能重写 流程控制
  10. private void method1(){
  11. System.out.println("father private method, control by father ");
  12. }
  13. //钩子方法 可实现 父类提供默认实现
  14. public void method2(){
  15. System.out.println("default method,prevent by father");
  16. }
  17.  
  18. }

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

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

  1. String driver="com.mysql.jdbc.Driver";
  2. Connection con;
  3. String url="jdbc:mysql://localhost:3306/demo";
  4. String user="root";
  5. String pwd="12345";
  6. //连接上数据库mysql
  7. public void connection2MYSQL()
  8. {
  9. try {
  10. Class.forName(driver);
  11.  
  12. con=DriverManager.getConnection(url,user,pwd);
  13.  
  14. if(!con.isClosed())
  15. System.out.println("连接成功");
  16.  
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }

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

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

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

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

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

  1. public interface StatementCallback {
  2. public void method3();
  3. }

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

  1. public class Son extends Father{
  2. public void method3(){
  3. System.out.println("implement by son");
  4. }
  5. }
  6.  
  7. public class Main {
  8. public static void main(String[] args){
  9. Father patten = new Son();
  10. patten.templateMethod(new StatementCallback() {
  11. @Override
  12. public void method3() {
  13. System.out.println("implement by user,callback");
  14. }
  15. });
  16. }
  17. }
  • 源码剖析

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

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

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

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

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

  1. int col = 0;
  2. KeyHolder keyHolder = new GeneratedKeyHolder();
  3. jdbcTemplate.update(new PreparedStatementCreator() {
  4. public PreparedStatement createPreparedStatement(Connection con)
  5. throws SQLException {
  6. PreparedStatement ps = con.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
  7. for(int i=0;i<args.length;i++){
  8. ps.setObject(i+1,args[i]);
  9. }
  10. return ps;
  11. }
  12. }, keyHolder);
  13. 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. [BAT]远程执行或停止计划任务

    执行 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPCWIN2K801 /u msdomain1\jzhang6 /p j ...

  2. 获取GUID的GET网址:createguid.com

    1.在浏览器的地址栏中输入createguid.com,回车之后即可得到一个GUID 2.在JMeter中可以这样填写HTTP Request 然后通过正则表达式提取器提取GUID <texta ...

  3. linux下第一个C程序

    首先,用vi编辑器新建一个文件 $vi hi.c 输入以下的程序(怎么用vi不说了) #include <stdio.h> int main() { printf("hello. ...

  4. 客户端、服务器端中JSON字符串与对象的转换

    客户端: 字符串转为对象:$.parseJSON(json); 对象转为字符串:JSON.stringify(_pasteDataItem) 服务器端(c#): 对象: [DataContract(N ...

  5. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...

  6. Linux应用开发入门(转)

    今天偶然看到这篇文章,做个入门了解还是不错的. 前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种“迷信”在目前似乎还很普遍.然而,情况并不是这样的 ...

  7. 破解Unity5.3.4f1

    破解的目的是将受限的个人版变为全功能的Pro版,破解后就可以使用所有功能了,界面也变成了黑色的主题. 破解网址(支持最新版的5.3.4f1): http://www.ceeger.com/forum/ ...

  8. Linux学习--2

    字符串 字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似 单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的:单引号字串中不能出现单引号(对 ...

  9. file.write(str),file.writelines(sequence)

    file.write(str)的参数是一个字符串,就是你要写入文件的内容.file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件.

  10. Tcl写法

    #=============================================================== #Analysi&Synthesis execute_modu ...