首页 > 编程知识 正文

数据库连接文件jdbc(机制与策略)

时间:2023-05-05 07:17:49 阅读:93109 作者:3568

软件项目实训及课程设计指导——如何应用策略设计模式分离JDBC数据库连接中的外部环境信息

1、什么是战略设计模式

策略设计模式主要是负责维护和查询“算法”程序类的“算法”、由特定策略程序类封装和实施的“环境”以及面向对象的设计方法中的继承机制

策略设计模式在GOF设计模式的分类中属于GOF设计模式中行为类型的设计模式。 下图是描述策略设计模式中各类之间关系的UML类图。 根据该UML类图,可以看到策略设计模式提供了一种替代面向对象设计方法中的继承的方法,将继承改为组合,在保持继承优点的同时比继承更具灵活性。 “算法”是独立的,可以自由扩展。

2、为什么要在软件应用系统的编程实现中应用策略设计模式

(1)策略设计模式可以将“算法”与“环境”分离

在软件APP系统的程序功能代码的编程实现中,为了分离实现“算法”的程序代码本身和使用算法的“客户端”侧的程序的结合关系,开发者经常使用策略也就是说,策略设计模式与“算法”使用它的客户端程序独立变化,且“算法”自身的变化(例如,“算法”的增减、修改等)为“算法”

因此,应用战略设计模型后,在软件应用系统的设计中可以实现的设计目标:

1 )保证软件APP系统具有良好的扩展性和维护性

2 )使用策略设计模式,在系统需求发生变化时,对程序代码的修改量少,并且能够迅速应对变化(可以通过添加新的功能来实现类)。

)2)策略设计模式的适用场景例1

例如,如果要为连接到连接接口的软件APP应用系统的持久性层数据库生成对象实例,则不希望出现以下情况:

直接在使用数据库连接对象实例的“程序”中显示实现各种物理数据库系统的“连接”的功能代码(这里是策略模式的“算法”)。 也就是说,策略模式下的“顾客”——是软件APP应用系统持久层中各种数据库访问操作的DAO组件。

这是因为这样的设计方案将“顾客”相关的程序代码与具体的“算法”功能实现的程序代码完全联系起来,“算法”相关的程序也经常发生变化。 应用这种设计方案的结果是,程序代码的维护性变差。 ——与“算法”相关的程序代码如果发生变化,将影响到相关的个别客户,因此需要被动进行修改和改进。

)3)策略设计模式的适用场景例2

作者应用生活中的例子,向读者解释战略设计模式的“算法”和“环境”相互分离的作用效果——“汉堡”为什么在世界上是一样的味道。

“汉堡”的制造技术(“算法”)为了独立的“环境”) )不同的国家或地区); 而且,“汉堡包”的顾客(各个国家的人)可以在各种环境中得到一贯的“味道”汉堡包。

3、《J2EE项目实践训练——UML与设计模式》一书详细介绍了战略设计模式的具体实现

作者由于考虑到本文篇幅的关系,不能向读者详细介绍GOF设计模式中战略设计模式的更深入的知识和具体实现步骤代码的例子等。 因此,针对策略设计模式的具体编程实现和程序代码示例,介绍清华大学出版社出版的作者《J2EE项目实践训练——UML与设计模式》一书(下图为图书封面)第10章(典型的GOF设计模式与应用)的相关内容

作者向读者介绍如何将策略模式设计应用于创建软件APP系统持久层数据库连接接口对象实例的功能实现程序代码。

4 .为什么要应用策略模式来创建数据库连接接口类型的对象实例

在JDBC数据库APP编程技术中,一般来说,作为进行数据库连接连接对象的实例化——通常的数据库连接连接对象的实例化的功能实现代码的例子,使用以下的代码

publicclassconnectdbbeanimplementsconnectdbinterface {

string JDBC _ dbdriver _类名称=' com.MySQL.JDBC .驱动程序';

string JDBC _ DSN _ URL=' JDBC : MySQL ://本地主机33603306/webbank ';

string JDBC _ dbusername='根';

字符串JDBC _数据库

rPassWord="root"; private java.sql.Connection oneConnectionObject = null; public ConnectDBBean() throws WebBankException { try{ Class.forName(JDBC_DBDriver_ClassName); } catch (java.lang.ClassNotFoundException e){ //在此先不考虑异常处理 } try{ oneConnectionObject =DriverManager.getConnection(JDBC_DSN_URL, JDBC_dbUserName, JDBC_dbUserPassWord); } catch (java.sql.SQLException e){ } catch (NullPointerException e){ } } }

作者为了节省篇幅,在上面的程序代码示例中,省略了一些无关的程序代码语句如包的引入和异常的捕获等。并请读者注意其中的黑体标识部分的语句代码,本程序代码示例是连接MySQL数据库系统中的名称为webbank数据库文件,并且访问数据库系统的账户及密码都设置为root。

在常规的数据库连接类的功能实现代码中,所存在的主要问题在于将数据库连接类中所需要的外部环境参数(上面示例代码中黑体部分的参数值)直接写在功能实现的程序代码中,而这些数据库连接相关的信息和参数是经常会发生变化的——比如访问数据库系统的账户所对应的密码、数据源的目标服务器主机的位置(可能为本机、也可能为网络中的远程主机)等。

软件应用系统的程序开发实现人员不应该在比如密码等这样的工作参数发生变化时,也要相应地去修改软件应用系统中的数据库连接实现的功能程序代码。否则,所开发实现的程序太缺少灵活性!

5、应用策略设计模式重构数据库连接Connection对象实例的创建代码

在GOF设计模式中的策略设计模式的基本思想,主要是要求软件应用系统的编程开发实现人员将某功能实现中所需要的各种可变化的环境参数分离出来,并用一个上下文环境程序类进行封装。

在示例项目银行账户信息管理系统中,作者首先是采用Java属性配置文件提供整个系统的配置信息,然后再利用一个名称为ClassNameConfig的程序类封装对Java属性配置文件中的各个属性项目的解析,从而动态地根据应用的需要获得对应的数据库连接相关的工作参数。

名称为ClassNameConfig的程序类也就是本示例中的上下文环境程序类,作者在下文中为读者介绍如何实现ClassNameConfig的程序类。

6、构建策略设计模式中的上下文环境ClassNameConfig类的功能实现代码

(1)在项目中添加一个属性配置文件 classNameConfig.properties

根据Java系统平台中对属性文件(*.properties)解析的基本要求,该属性配置文件应该要存放在软件应用系统的classpath所在的路径中。该路径对于Web方式的应用程序则是在WEB–INFO/classes目录下。

但读者一定要注意属性配置文件(*.properties)的相对路径,否则对属性配置文件进行解析的程序将会由于找不到此属性配置文件而抛出找不到文件的异常错误信息。

因此,读者只需要在MyEclipse开发工具中右击项目的src文件夹,并在弹出的【新建文件】的对话框中输入属性配置文件名 classNameConfig.properties。最后的操作结果的图示请见下图示例图所示。

(2)设计属性配置文件 classNameConfig.properties中的配置项目

由于Java属性配置文件(*.properties)的项目内容是"键/值"对的形式存储,因此根据项目的数据库连接的需要分别提供五个不同的属性项目。

每个项目的内容请见下图所示的内容——它们分别代表MySQL数据库的JDBC驱动程序类、MySQL数据库文件webbank和在该数据库中的账号root和密码root等信息。

(3)设计一个获得属性配置文件中的各个属性项目的ClassNameConfig程序类

在java.lang.Class类中的getResourceAsStream方法将直接返回一个InputStream类型的流对象实例,而getResourceAsStream功能方法是查找具有给定名称的资源并返回 InputStream对象。

但要注意的是:getResourceAsStream功能方法在查找和定位属性配置文件时是相对于"/"根路径下的位置——这样的路径是指定绝对路径;如果在标识属性配置文件时不以"/"字符开头,则查找和定位的路径是相对于这个程序类(也就是ClassNameConfig程序类)文件所在包的路径。比如,下面的程序代码示例:

InputStream oneInputStreamObject = ClassNameConfig.class.getResourceAsStream("/classNameConfig.properties");

而java.lang.ClassLoader类中的getResource()功能方法则是从系统的classpath的根路径开始查找带有给定名称的资源路径和文件名并返回一个URL类型的对象示例。当然,当指定的程序类名字不能在当前的classpath目录路径中找到时,getResource()功能方法将返回null。

java.lang.Thread类中的contextClassLoader属性则代表线程的上下文 ClassLoader,因为每个运行中的线程都有一个成员contextClassLoader属性对象,用来在运行时动态地载入其它的程序类。并且可以采用下面形式的程序代码获得当前线程的contextClassLoader对象实例。

ClassLoader currentClassLoader= Thread.currentThread().getContextClassLoader();

因此,如果在某个线程中需要应用并加载某个外部的功能类,可以首先利用Thread.currentThread().getContextClassLoader()功能方法获得该线程的对象实例的contextClassLoader;然后再利用所获得的contextClassLoader对象实例请求它的父ClassLoader对象实例来完成外部程序类的载入请求。

完整的ClassNameConfig程序类的功能实现代码请见下面的程序代码示例所示——ClassNameConfig类的功能实现代码示例

package com.px1987.webbank.config; import java.util.Properties; import java.io.*; public class ClassNameConfig { public ClassNameConfig() { } private static Properties onePropertiesObject =null; static { onePropertiesObject = new Properties(); try{ InputStream oneInputStreamObject = Thread.currentThread().getContextClassLoader(). getResource("classNameConfig.properties").openStream(); onePropertiesObject.load(input); }catch(Exception e){ e.printStackTrace(); } } public static String getProperty(String propName){ return onePropertiesObject.getProperty(propName); } public static void setProperty(String propName, String prop Value){ onePropertiesObject.setProperty(propName, propValue); } }

请读者注意其中的黑体标识的语句,由于static静态成员属性对象能够达到全局缓存的应用效果,并且static语句块是在该程序类被加载时就执行的、而且也只执行一次。因此,static语句块也能够产生一种"单例"(单一对象实例,也就是单例设计模式)的应用效果,避免重复地对属性配置文件(*.properties)进行加载。另外,下面的语句代码片段:

InputStream oneInputStreamObject =Thread.currentThread().getContextClassLoader(). getResource("classNameConfig.properties").openStream();

其实等同于下面的程序代码:

ClassLoader currentClassLoader=Thread.currentThread().getContextClassLoader(); URL oneURL = currentClassLoader.getResource("classNameConfig.properties"); InputStream oneInputStreamObject = oneURL.openStream();

如何正确地创建和销毁软件应用系统中JDBC数据库连接对象实例

在程序中如何正确地创建和销毁软件应用系统中文件IO流对象实例

如何正确地创建和销毁网络通讯程序中的Socket类的对象实例

如何应用Java反射技术灵活地创建程序类的对象实例

如何应用GOF设计模式中的构建者模式创建复合对象实例

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。