driver,url,user,password写在一个DBConfig.properties的配置文件中,然后读取配置文件。这样,想使用哪种数据库的时候,只需要修改这个配置文件就行了。其实,这样做是可以的……那么有没有更好的方法呢?
答案是当然的,下面看看我怎么写的……
先给大家截一张图看看目录结构吧
下面是各个类的源代码
DBConnection.java真正用于连接数据库
- package org.cdy.www.conn;
- import java.sql.Connection;
- import org.cdy.www.factory.DBConnectionFactory;
- import org.cdy.www.service.IDBConnection;
- public class DBConnection {
- /**
- * @param args
- */
- public static Connection getConnection() {
- /**
- * 用户无需了解底层是如何实现的,它也不需要关心使用的是哪种数据库
- */
- IDBConnection service = DBConnectionFactory.getInstance();
- Connection conn = service.getConnection();
- return conn;
- }
- public static void closeConnection(Connection conn) {
- IDBConnection service = DBConnectionFactory.getInstance();
- service.closeConnection(conn);
- }
- }
下面这个就是我的工厂了
DBConnectionFactory.java
- package org.cdy.www.factory;
- import org.cdy.www.service.IDBConnection;
- public class DBConnectionFactory {
- private static IDBConnection instance;
- //同步锁
- private static Object initLock = new Object();
- public static IDBConnection getInstance() {
- if (instance == null) {
- synchronized (initLock) {
- try {
- try {
- instance = (IDBConnection) Class.forName(
- DBConnectionConfig.className).newInstance();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return instance;
- }
- }
DBConnectionFactory.java它有一个辅助类DBConnectionConfig.java用来读取配置文件
- package org.cdy.www.factory;
- import java.io.IOException;
- import java.util.Properties;
- public class DBConnectionConfig {
- private static Properties prop = new Properties();
- static {
- try {
- prop.load(DBConnectionConfig.class
- .getResourceAsStream("DBConnectionConfig.properties"));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static String className = prop.getProperty("className");
- }
接下来才是我怎么去访问数据库了,这里我写了一个接口
具体是谁是获得连接对象,让实现该接口的类去做吧
- package org.cdy.www.service;
- import java.sql.Connection;
- public interface IDBConnection {
- public abstract Connection getConnection();
- public abstract void closeConnection(Connection conn);
- }
由于数据库的关闭操作对于所有实现该接口的类都是采用一样的方法conn.close()所有我写了一个抽象类AbstractConnectionImpl.java
- package org.cdy.www.serviceImpl;
- import java.sql.Connection;
- import java.sql.SQLException;
- import org.cdy.www.service.IDBConnection;
- public abstract class AbstractConnectionImpl implements IDBConnection {
- public void closeConnection(Connection conn) {
- try {
- conn.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public Connection getConnection() {
- // TODO Auto-generated method stub
- return null;
- }
- }
至于获得连接对象Connection则由各种数据库类自己去实现,它们只需要override就行了
下面是采用MSSQL数据库的方式
- package org.cdy.www.serviceImpl;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- public class MSSqlConnectionImpl extends AbstractConnectionImpl {
- @Override
- public Connection getConnection() {
- // TODO Auto-generated method stub
- Connection conn = null;
- try {
- Class.forName(MSSqlConnectionConfig.driver);
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- conn = DriverManager.getConnection(MSSqlConnectionConfig.url,
- MSSqlConnectionConfig.user, MSSqlConnectionConfig.password);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return conn;
- }
- @Override
- public void closeConnection(Connection conn) {
- // TODO Auto-generated method stub
- super.closeConnection(conn);
- }
- }
它对应自己的配置类、配置文件
- package org.cdy.www.serviceImpl;
- import java.io.IOException;
- import java.util.Properties;
- public class MSSqlConnectionConfig {
- private static Properties prop = new Properties();
- static {
- try {
- prop.load(MSSqlConnectionConfig.class
- .getResourceAsStream("MSSqlConnectionConfig.properties"));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static String driver = prop.getProperty("driver");
- public static String url = prop.getProperty("url");
- public static String user = prop.getProperty("user");
- public static String password = prop.getProperty("password");
- }
配置文件
- driver=com.microsoft.JDBC.sqlserver.SQLServerDriver
- url=jdbc:microsoft:sqlserver://localhsot:1433;databaseName=test
- user=sa
- password=sa
其它数据库类似……这里就不多说了
当我们用的时候,就像DBConnection.java中那样不需要关心它是那种数据库
或许你、我未来的老板有一天,想换数据库了,很简单,我只需要修改DBConnectionConfig.properties就行了……
不完善的地方,请多多指教,大家一起交流QQ:412183103