JDBC数据库访问封装之工厂模式

 今天自学了阎宏博士的《JAVA与模式》一书中的工厂模式,deyinchan就想做一个实例,通过实践真正意义上认识,运用设计模式。我想,凡是学过JDBC的人都想过把对数据库的访问封装起来,以便下次使用方便。通常,我们会写一个DBConnection类,它有两个静态(static)方法分别是getConnection()和closeConnection(Connection conn),在getConnection()中连接数据库,获得一个Connection,至于怎么获得的连接,我就不用多说了(第一步,加载jdbc驱动Class.forName(String driver)。第二步,DriverManager.getConnection(String url,String user,String password))。用的时候呢就DBConnection.getConnection(),关闭的时候DBConnection.closeConnection(conn),你是不是也这么做过呢?其实这种封装,我称他为learner封装,或许还有菜鸟会这么做写一个DBConfig类把上面的

driver,url,user,password写在一个DBConfig.properties的配置文件中,然后读取配置文件。这样,想使用哪种数据库的时候,只需要修改这个配置文件就行了。其实,这样做是可以的……那么有没有更好的方法呢?

答案是当然的,下面看看我怎么写的……

先给大家截一张图看看目录结构吧

下面是各个类的源代码

DBConnection.java真正用于连接数据库

  1. package org.cdy.www.conn;
  2. import java.sql.Connection;
  3. import org.cdy.www.factory.DBConnectionFactory;
  4. import org.cdy.www.service.IDBConnection;
  5. public class DBConnection {
  6.     /**
  7.      * @param args
  8.      */
  9.     public static Connection getConnection() {
  10.         /**
  11.          * 用户无需了解底层是如何实现的,它也不需要关心使用的是哪种数据库
  12.          */
  13.         IDBConnection service = DBConnectionFactory.getInstance();
  14.         Connection conn = service.getConnection();
  15.         return conn;
  16.     }
  17.     public static void closeConnection(Connection conn) {
  18.         IDBConnection service = DBConnectionFactory.getInstance();
  19.         service.closeConnection(conn);
  20.     }
  21. }

 

下面这个就是我的工厂了

DBConnectionFactory.java

  1. package org.cdy.www.factory;
  2. import org.cdy.www.service.IDBConnection;
  3. public class DBConnectionFactory {
  4.     private static IDBConnection instance;
  5.     //同步锁
  6.     private static Object initLock = new Object();
  7.     public static IDBConnection getInstance() {
  8.         if (instance == null) {
  9.             synchronized (initLock) {
  10.                 try {
  11.                     try {
  12.                         instance = (IDBConnection) Class.forName(
  13.                                 DBConnectionConfig.className).newInstance();
  14.                     } catch (ClassNotFoundException e) {
  15.                         // TODO Auto-generated catch block
  16.                         e.printStackTrace();
  17.                     }
  18.                 } catch (InstantiationException e) {
  19.                     // TODO Auto-generated catch block
  20.                     e.printStackTrace();          
  21.                 } catch (IllegalAccessException e) {
  22.                     // TODO Auto-generated catch block
  23.                     e.printStackTrace();
  24.                 }
  25.             }
  26.         }
  27.         return instance;
  28.     }
  29. }

 

DBConnectionFactory.java它有一个辅助类DBConnectionConfig.java用来读取配置文件

  1. package org.cdy.www.factory;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. public class DBConnectionConfig {
  5.     private static Properties prop = new Properties();
  6.     static {
  7.         try {
  8.             prop.load(DBConnectionConfig.class
  9.                     .getResourceAsStream("DBConnectionConfig.properties"));
  10.         } catch (IOException e) {
  11.             // TODO Auto-generated catch block
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.     public static String className = prop.getProperty("className");
  16. }

接下来才是我怎么去访问数据库了,这里我写了一个接口

具体是谁是获得连接对象,让实现该接口的类去做吧

  1. package org.cdy.www.service;
  2. import java.sql.Connection;
  3. public interface IDBConnection {
  4.     public abstract Connection getConnection();
  5.     public abstract void closeConnection(Connection conn);
  6. }

由于数据库的关闭操作对于所有实现该接口的类都是采用一样的方法conn.close()所有我写了一个抽象类AbstractConnectionImpl.java

  1. package org.cdy.www.serviceImpl;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import org.cdy.www.service.IDBConnection;
  5. public abstract class AbstractConnectionImpl implements IDBConnection {
  6.     public void closeConnection(Connection conn) {
  7.         try {
  8.             conn.close();
  9.         } catch (SQLException e) {
  10.             // TODO Auto-generated catch block
  11.             e.printStackTrace();
  12.         }
  13.     }
  14.     public Connection getConnection() {
  15.         // TODO Auto-generated method stub
  16.         return null;
  17.     }
  18. }

 

至于获得连接对象Connection则由各种数据库类自己去实现,它们只需要override就行了

下面是采用MSSQL数据库的方式

  1. package org.cdy.www.serviceImpl;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. public class MSSqlConnectionImpl extends AbstractConnectionImpl {
  6.     @Override
  7.     public Connection getConnection() {
  8.         // TODO Auto-generated method stub
  9.         Connection conn = null;
  10.         try {
  11.             Class.forName(MSSqlConnectionConfig.driver);
  12.         } catch (ClassNotFoundException e) {
  13.             // TODO Auto-generated catch block
  14.             e.printStackTrace();
  15.         }
  16.         try {
  17.             conn = DriverManager.getConnection(MSSqlConnectionConfig.url,
  18.                     MSSqlConnectionConfig.user, MSSqlConnectionConfig.password);
  19.         } catch (SQLException e) {
  20.             // TODO Auto-generated catch block
  21.             e.printStackTrace();
  22.         }
  23.         return conn;
  24.     }
  25.     @Override
  26.     public void closeConnection(Connection conn) {
  27.         // TODO Auto-generated method stub
  28.         super.closeConnection(conn);
  29.     }
  30. }

它对应自己的配置类、配置文件

 

  1. package org.cdy.www.serviceImpl;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. public class MSSqlConnectionConfig {
  5.     private static Properties prop = new Properties();
  6.     static {
  7.         try {
  8.             prop.load(MSSqlConnectionConfig.class
  9.                     .getResourceAsStream("MSSqlConnectionConfig.properties"));
  10.         } catch (IOException e) {
  11.             // TODO Auto-generated catch block
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.     public static String driver = prop.getProperty("driver");
  16.     public static String url = prop.getProperty("url");
  17.     public static String user = prop.getProperty("user");
  18.     public static String password = prop.getProperty("password");
  19. }

配置文件

 

  1. driver=com.microsoft.JDBC.sqlserver.SQLServerDriver
  2. url=jdbc:microsoft:sqlserver://localhsot:1433;databaseName=test
  3. user=sa
  4. password=sa

其它数据库类似……这里就不多说了

当我们用的时候,就像DBConnection.java中那样不需要关心它是那种数据库

或许你、我未来的老板有一天,想换数据库了,很简单,我只需要修改DBConnectionConfig.properties就行了……

不完善的地方,请多多指教,大家一起交流QQ:412183103

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值