`
dongguoh
  • 浏览: 70811 次
  • 性别: Icon_minigender_1
  • 来自: 山水之乡
社区版块
存档分类
最新评论

模板模式 模仿Spring写的 JdbcTemplate 不懂Spring 没关系 很实用

    博客分类:
  • JAVA
阅读更多
java 代码
 
  1. 在这里我首先以一个比较简单的小例子让不知道模板模式的人先有个入门的概念。(如果要想深入了解,去看<java与模式>)  
  2. 在后面的例子我将以一个比较实用的例子来说明这种模式给我们带来的好处,并且这个例子很实用。下面我会把所有的代码  
  3. 都贴出来,你可以直接Copy代码就可以运行,如果你已经有啦一定了解,那么就直接看第二个吧。  
  4. 在这里我希望你把它看完,并把它理解。因为开始我在看Spring的源码的时候也是看啦好多次才把思路理清楚的。  
  5.   
  6. 首先先说说这两个例子的作用,要不然看啦大半天都不知道是什么东西。  
  7.   
  8. 第一个: 当我们去买东西的时候,东西都会打折,然而每种东西的折扣都不一样。如买Book的时候,书的折扣是 0.8 折  
  9.         而当我们去买 Video 的时候,它是 0.7 折,如果这些分类的商品很多的时候。而我们每次都要 在每一个类  
  10.         中写一个打折后得到的实际价格的话,那是不是感觉到很累赘。也很不爽。所以我们有必要把它抽象出来。那么  
  11.         每个类只要从这个类继承就可以啦。如果重用的方法多的话,那么这就会带来很大的好处.  
  12.   
  13.         看源代码:  
  14. /* 
  15.  * 这是一个模板方法的抽象类,所有的将要打折的商品都要从它继承 
  16.  * 那么就会得到getRealPrice()这个模板方法,当然,这里只是为了 
  17.  * 说明模板方法的用处 
  18.  */  
  19. package com.dongguoh;  
  20.   
  21. public abstract class Item {  
  22.       
  23.     protected abstract float getUnitPrice();  
  24.     protected abstract float getDiscountRate();  
  25.       
  26.     public float getRealPrice(){  
  27.         return this.getDiscountRate()*this.getUnitPrice();  
  28.     }  
  29.   
  30. }  
  31.   
  32. package com.dongguoh;  
  33.   
  34. public class Video extends Item{  
  35.     /*   
  36.      * 在实际当中,这些要返回的值应当是从数据库当中去取 
  37.      */  
  38.     protected float getDiscountRate() {  
  39.         return 0.8f;  
  40.     }  
  41.     protected float getUnitPrice() {  
  42.         return 300;  
  43.     }  
  44.   
  45. }  
  46.   
  47. package com.dongguoh;  
  48.   
  49. public class Book extends Item {  
  50.     /*   
  51.      * 在实际当中,这些要返回的值应当是从数据库当中去取 
  52.      */  
  53.     public float getDiscountRate() {          
  54.         return 0.7f;  
  55.     }  
  56.     public float getUnitPrice() {  
  57.         return 88;  
  58.     }  
  59.   
  60. }  
  61.   
  62. 下面这是测试方法  
  63. package com.dongguoh;  
  64.   
  65. import java.sql.*;  
  66.   
  67. import junit.framework.TestCase;  
  68.   
  69. public class TestTemplate extends TestCase {  
  70.     public void testMethod(){  
  71.         Book bk=new Book();  
  72.         Video vd=new Video();  
  73.         System.out.println("BookRealPrice: "+bk.getRealPrice());  
  74.         System.out.println("VideoRealPrice: " +vd.getRealPrice());  
  75.     }     
  76. }  
  77.   
  78. 结果:  
  79.   
  80. BookRealPrice: 61.6  
  81. VideoRealPrice: 240.0  
  82.   
  83. 上面这个例子比较简单,我就不多说啦,下面的是个实用的例子  
  84.   
  85. 例子二: 如果不是用Orm工具而是用经常用jdbc操作数据库的人会感到每次要连接到数据库,CRUD 数据的时候写一大串的  
  86.         try{}catch{},几乎每次都写,真是他妈的烦死啦。大家肯定有同感吧,反正我开始还不会用ORM工具的时候就觉得很麻烦的  
  87.         而当你看啦下面这个例子后就就会觉得方便多啦.也不用写那么多的try catch{}啦,  
  88.         直得高兴的是Spring中对这做啦很好的封装,所以我就横批写啦一个,这样就不与Spring偶合在  
  89.         一起啦,可以单独的拿出来使用.  
  90.   
  91. 这时是数据库的表:  
  92.   
  93. DROP DATABASE IF EXISTS `hibernate`;  
  94. CREATE DATABASE `hibernate` ;  
  95. USE `hibernate`;  
  96. CREATE TABLE `person` (  
  97.   `id` int(32) NOT NULL DEFAULT '0',  
  98.   `name` varchar(20) NOT NULL,  
  99.   `password` varchar(20) NOT NULL,  
  100.   PRIMARY KEY (`id`)  
  101. ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;  
  102.   
  103.   
  104. 1.首先我们先做一个接口,现在先不管它,等下你就知道他有什么用啦  
  105.   
  106. package com.dongguoh;  
  107.   
  108. import java.sql.*;  
  109. /* 
  110.  * 用匿名类的方式去运用这个接口 
  111.  */  
  112. public interface IStatementCallback {  
  113.     public Object doInStatement(Statement stmt) throws RuntimeException,SQLException;  
  114.       
  115. }  
  116.   
  117. 2.而这里是最关键的,就是建一个Jdbc的模板方法,把那些经常要做的try{} catch{}都写在一个类里  
  118.     免得以后每次都还去写。这就成啦代码复用.  
  119.   
  120. package com.dongguoh;  
  121.   
  122. import java.sql.*;  
  123. /* 
  124.  * 在这里我就不用Spring的注入啦,直接写个完整的 
  125.  * 如果不会Spring的,也同样的像使用Spring中的JdbcTemplate类一样的使用. 
  126.  * 如果你看过Spring的书,那么这个例子也是一个Spring的入门jdbc的好例子 
  127.  *  
  128.  * 而在这里我们的这个JdbcTemplate就成啦一个通用的方法,以后我们要SQL语句连接数据库的 
  129.  * 时候不用每次都去写try{}catch{}啦,老那样写真的很烦,一次性就把它搞定啦 
  130.  */  
  131. public class JdbcTemplate {  
  132.       
  133.   
  134.     public Object execute(IStatementCallback action) {  
  135.         Connection conn = null;  
  136.         Statement stmt = null;  
  137.         Object result = null;         
  138.         try {  
  139.             conn=this.getConnection();  
  140.             conn.setAutoCommit(false);            
  141.             stmt=conn.createStatement();  
  142.               
  143.             //注意这一句  
  144.             result=action.doInStatement(stmt);  
  145.               
  146.             conn.commit();  
  147.             conn.setAutoCommit(true);             
  148.         } catch (SQLException e) {  
  149.             transactionRollback(conn);//进行事务回滚  
  150.             e.printStackTrace();  
  151.             throw new RuntimeException(e);  
  152.         }finally{  
  153.             this.closeStatement(stmt);  
  154.             this.closeConnection(conn);  
  155.         }  
  156.   
  157.         return result;  
  158.     }  
  159.       
  160.     /* 
  161.      * 当发生异常时进行事务回滚 
  162.      */  
  163.     private void transactionRollback(Connection conn){  
  164.         if(conn!=null){  
  165.             try {  
  166.                 conn.rollback();  
  167.             } catch (SQLException e) {  
  168.                 // TODO Auto-generated catch block  
  169.                 e.printStackTrace();  
  170.             }  
  171.         }  
  172.           
  173.     }  
  174.     //关闭打开的Statement  
  175.     private void closeStatement(Statement stmt){  
  176.         if(stmt!=null){  
  177.             try {  
  178.                 stmt.close();  
  179.                 stmt=null;  
  180.             } catch (SQLException e) {  
  181.                 e.printStackTrace();  
  182.             }  
  183.         }  
  184.     }  
  185.     //关闭打开的Connection   
  186.     private void closeConnection(Connection conn){  
  187.         if(conn!=null){  
  188.             try {  
  189.                 conn.close();  
  190.                 conn=null;  
  191.             } catch (SQLException e) {  
  192.                 e.printStackTrace();  
  193.             }  
  194.         }  
  195.     }  
  196.   
  197.     //取得一个Connction  
  198.     private Connection getConnection() {          
  199.         String driver = "com.mysql.jdbc.Driver";  
  200.         String url = "jdbc:mysql://127.0.0.1/Hibernate";          
  201.         Connection conn=null;  
  202.         try {  
  203.             Class.forName(driver);  
  204.             conn = DriverManager.getConnection(url, "root""dongguoh");  
  205.         } catch (ClassNotFoundException e) {  
  206.             e.printStackTrace();  
  207.         } catch (SQLException e) {  
  208.             e.printStackTrace();  
  209.         }  
  210.         return conn;  
  211.     }  
  212.   
  213. }  
  214.   
  215. 下面是我们的测试方法:  
  216. package com.dongguoh;  
  217.   
  218. import java.sql.*;  
  219.   
  220. import junit.framework.TestCase;  
  221.   
  222. public class TestTemplate extends TestCase {  
  223.   
  224.     public void testJdbcTemplate(){  
  225.         JdbcTemplate jt=new JdbcTemplate();  
  226.         /* 
  227.          * 因为IStatementCallback是一个接口,所以我们在这里直接用一个匿名类来实现 
  228.          * 如果已经正确的插入啦一条数据的话 ,它会正确的返回一个 整数 1  
  229.          * 而我们这里的stmt是从JdbcTemplate中传过来的 
  230.          */  
  231.         int count=(Integer)jt.execute(new IStatementCallback(){  
  232.             public Object doInStatement(Statement stmt) throws RuntimeException, SQLException {  
  233.   
  234.                 String sql="INSERT INTO person VALUES(1,'dongguoh','123456')";  
  235.                 int result=stmt.executeUpdate(sql);  
  236.                 return new Integer(result);  
  237.             }             
  238.         });       
  239.         System.out.println("Count: "+count);  
  240.           
  241.         /* 
  242.          * 在这里我们就把刚刚插入的数据取出一个数据,直接输出来 
  243.          *  
  244.          */  
  245.         jt.execute(new IStatementCallback(){  
  246.             public Object doInStatement(Statement stmt) throws RuntimeException, SQLException {  
  247.   
  248.                 String sql="SELECT name,password FROM person WHERE id=1";  
  249.                 ResultSet rs=null;  
  250.                 rs=stmt.executeQuery(sql);  
  251.                 if(rs.next()){  
  252.                     System.out.println(rs.getString("name"));  
  253.                     System.out.println(rs.getString("password"));  
  254.                 }  
  255.                 /* 
  256.                  * 在这里就直接返回一个1啦,如果你愿意的话,你可以再写一个Person类 
  257.                  * 在if语句中实例化它,赋值再把它返回 
  258.                  */  
  259.                 return new Integer(1);  
  260.             }             
  261.         });       
  262.     }  
  263. }  
  264.   
  265. 测试结果:  
  266. Count: 1  
  267. dongguoh  
  268. 123456  
  269.   
  270. 如果你要用 PreparedStatement 的话,想传参数的话,再写一个接口来实现,再在JdbcTemplate重载一个方法  
  271.     如public Object execute(IPreparedStatementCallback action,,Object[] objArray)再多传一个你要传递的参数数组,  
  272.     这样做就OK啦,试试吧,感觉会更好,这就是模板方法给我们带来的好处,没事看看 设计模式 类的书感觉蛮爽的  
分享到:
评论
9 楼 westsince2001 2007-09-04  
还是很不错啊。多谢楼主
8 楼 realdah 2007-09-03  
。。。匿名类在AWT中应用很多。。。。。
7 楼 惊鸿逝水 2007-09-03  
不好,过于简陋!
transaction没有与业务逻辑分开,SQL的执行和业务逻辑也没有分离,和写JDBC没什么区别
6 楼 dongguoh 2007-09-03  
其实写Blog只是为啦增强自己的记忆,计算机这东西是经常忘的
自己写啦过后有点映象,以后忘啦看看就可以回忆起来啦。
既然写出来啦,不仅让自己看,也是给别人看的。我经常看到一些
在网上写的东西,看啦半天不知道写什么,还浪费啦时间。开始我写的时候,有时候就是只贴出代码来,连解释都没有,想想不应该这样,这样只有自己看得懂,别人看的时候浪费时间不值得。
我有个百度的也写啦很多,喜欢的话可以去看看,都是些基础的。
地址是 http://hi.baidu.com/dongguoh 
过两天要上课啦,看计算机的书的时间又减少啦。唉~~~
5 楼 nicky_hk 2007-09-02  
说实话  楼主写的文章非常的细心    你的blog写的都很仔细~~~我都看了一遍 以后可以考虑出一本书了  呵呵
4 楼 xmlspy 2007-09-02  
spring当初还不叫spring的时候(那时候叫interface21),偶就用它的sql封装的东东了
那时候用的比较多的是一些对象比如SqlFunction......

后来感觉还是JdbcTemplate好用,就用这个了
3 楼 xmlspy 2007-09-02  
spring当初还不叫spring的时候(那时候叫interface21),偶就用它的sql封装的东东了
那时候用的比较多的是一些对象比如SqlFunction......

后来感觉还是JdbcTemplate好用,就用这个了
2 楼 dongguoh 2007-09-02  
其实在Spring中的 JdbcTemplate类 中好多都是用匿名类来实现的
我也才学Spring偶尔觉得奇怪就看下源码。就模仿着写感觉一下,呵呵
1 楼 laorer 2007-09-02  
感觉不错,原来一直不知道匿名类做什么用,现在看到了一种.谢了

相关推荐

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

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

    spring-jdbcTemplate实例工程

    Spring JdbcTemplate的出现是为了弥补原生JDBC在编码上的繁琐,它通过模板方法模式,将SQL执行、结果集处理等进行了抽象,使得开发者可以更专注于业务逻辑,而无需过多关注数据库访问的细节。同时,它还提供了事务...

    模仿spring jdbcTemplate的实现

    模仿spring jdbcTemplate的粗略实现,只有很小的参考价值,如果是java初学者可以使用这个封装好的工具进行数据库操作,只需要在db.properties里配置好driver,url等信息

    spring的jdbcTemplate小案例

    在本文中,我们将深入探讨Spring框架中的一个核心组件——JdbcTemplate。JdbcTemplate是Spring提供的一种数据库操作工具,它简化了数据库访问,使开发者...在实际项目中,JdbcTemplate是Spring开发中不可或缺的一部分。

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    SpringJdbcTemplate封装工具类

    SpringJdbcTemplate是一个模板类,它提供了大量的方法来执行SQL查询、更新、存储过程等操作。这些方法会自动处理JDBC相关的资源关闭、异常转换等细节,使得代码更加整洁和健壮。 2. **数据库自适应** Spring...

    strut2+spring+springjdbctemplate做的简易登录系统

    Spring JDBC Template被用来简化数据库操作,它提供了一种模板方法模式,将SQL执行、结果集处理等细节进行了封装,使得开发者只需要关注SQL语句和处理结果即可。例如,登录验证可能涉及查询用户表,查找与输入用户名...

    基于注解的Spring JdbcTemplate

    **基于注解的Spring JdbcTemplate** 在Java世界中,Spring框架是企业级应用开发的首选。Spring JDBC模絫提供了一种简洁的方式来处理数据库操作,而`Spring JdbcTemplate`是这个模絫的核心组件。本教程将深入探讨...

    Spring-JdbcTemplate

    ### Spring-JdbcTemplate...总之,Spring-JdbcTemplate通过其简洁的API和强大的功能,极大地简化了JDBC编程,是Spring框架中不可或缺的一部分,对于Java后端开发人员来说,掌握其使用方法是提升数据库操作效率的关键。

    Spring JdbcTemplate

    **Spring JdbcTemplate**是Spring框架中的一个核心组件,主要用于简化Java数据库访问。它提供了一种模板化的方式来执行SQL语句,使得开发人员可以避免编写大量的重复代码,专注于业务逻辑,而不是底层的数据库交互...

    利用spring的jdbcTemplate处理blob、clob

    spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。

    struts+spring +jdbctemplate demo

    Struts、Spring 和 JDBCTemplate 是三个在 Java Web 开发中常用的框架和技术,它们结合使用可以构建出高效且灵活的企业级应用程序。在这个“Struts+Spring+JdbcTemplate Demo”中,我们将探讨这三个组件如何协同工作...

    Spring Security 3.1 +Spring +Servlet+JdbcTemplate

    Spring框架是Java开发中不可或缺的一部分,它简化了应用开发并提供了诸如依赖注入、面向切面编程等核心特性。在本项目中,Spring作为一个服务提供者,帮助管理组件间的依赖关系,同时通过AOP实现事务管理和日志记录...

    spring-springMvc-jdbctemplate.rar

    在本项目中,"spring-springMvc-jdbctemplate.rar" 是一个包含了使用Spring框架、Spring MVC和JdbcTemplate实现的Web应用示例。这个压缩包可能包含了一系列的配置文件、源代码和数据库脚本,旨在展示如何整合这些...

    配制Spring事务和JdbcTemplate使用

    配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用

    spring jdbctemplate实例

    它提供了一种模板方法模式,抽象出了一些常见的数据库访问任务,使得开发者无需关注低级的JDBC细节,如打开和关闭连接、处理结果集等,从而可以更加专注于业务逻辑。在本实例中,我们将探讨如何使用Spring ...

    Spring JdbcTemplate api

    ### Spring JdbcTemplate API:数据库操作的模板模式 #### 概述 在Spring框架中,`JdbcTemplate`是一个用于简化JDBC编程的工具类,它采用了模板模式来分离数据库访问中的不变和可变部分,提供了一种更加健壮且易于...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    Spring框架提供了多种模板类来处理不同的数据访问需求,例如JdbcTemplate主要针对关系型数据库的操作。 在使用JdbcTemplate前,需要导入两个jar包: - spring-jdbc-4.2.4.RELEASE.jar:包含JdbcTemplate及与数据库...

Global site tag (gtag.js) - Google Analytics