如何将我的数据库类转换为Singleton

时间:2015-03-26 04:59:56

标签: singleton

我是java的初学者,我正在练习 Singleton

我试图弄清楚如何将我的数据库类转换为Singleton。

此外,我的部分问题是如何在不传递构造函数中的属性的情况下使用Database类。

public class Database {

public static final String DB_DRIVER_KEY = "db.driver";
public static final String DB_URL_KEY = "db.url";
public static final String DB_USER_KEY = "db.user";
public static final String DB_PASSWORD_KEY = "db.password";

private static Logger LOG = Logger.getLogger(Database.class.getName());

private static final Database theInstance = new Database();
private static Connection connection;
private static Properties properties;

private Database() {
}

public static void init(Properties properties) {
    if (Database.properties == null) {
        LOG.debug("Loading database properties from db.properties");
        Database.properties = properties;
    }
}

public static Connection getConnection() throws SQLException {
    if (connection != null) {
        return connection;
    }

    try {
        connect();
    } catch (ClassNotFoundException e) {
        throw new SQLException(e);
    }

    return connection;
}

private static void connect() throws ClassNotFoundException, SQLException {
    String dbDriver = properties.getProperty(DB_DRIVER_KEY);
    LOG.debug(dbDriver);
    Class.forName(dbDriver);
    System.out.println("Driver loaded");
    connection = DriverManager.getConnection(properties.getProperty(DB_URL_KEY),
            properties.getProperty(DB_USER_KEY), properties.getProperty(DB_PASSWORD_KEY));
    LOG.debug("Database connected");
}

/**
 * Close the connections to the database
 */
public void shutdown() {
    if (connection != null) {
        try {
            connection.close();
            connection = null;
        } catch (SQLException e) {
            LOG.error(e.getMessage());
        }
    }
}

/**
 * Determine if the database table exists.
 * 
 * @param tableName
 * @return true is the table exists, false otherwise
 * @throws SQLException
 */
public static boolean tableExists(String tableName) throws SQLException {
    DatabaseMetaData databaseMetaData = getConnection().getMetaData();
    ResultSet resultSet = null;
    String rsTableName = null;

    try {
        resultSet = databaseMetaData.getTables(connection.getCatalog(), "%", "%", null);
        while (resultSet.next()) {
            rsTableName = resultSet.getString("TABLE_NAME");
            if (rsTableName.equalsIgnoreCase(tableName)) {
                return true;
            }
        }
    } finally {
        resultSet.close();
    }

    return false;
}

/**
 * @return the theinstance
 */
public static Database getTheinstance() {
    return theInstance;
 }
}

1 个答案:

答案 0 :(得分:0)

这一点点改变你现有的课程让你明白。

public class Database {

public static final String DB_DRIVER_KEY = "db.driver";
public static final String DB_URL_KEY = "db.url";
public static final String DB_USER_KEY = "db.user";
public static final String DB_PASSWORD_KEY = "db.password";

private static Logger LOG = Logger.getLogger(Database.class.getName());

private static Database theInstance;
private static Connection connection;
private static Properties properties;

private Database() {
}

public static void init(Properties properties) {
    if (Database.properties == null) {
        LOG.debug("Loading database properties from db.properties");
        Database.properties = properties;
    }
}

public static Connection getConnection() throws SQLException {
    if (connection != null) {
        return connection;
    }

    try {
        connect();
    } catch (ClassNotFoundException e) {
        throw new SQLException(e);
    }

    return connection;
}

private static void connect() throws ClassNotFoundException, SQLException {
    String dbDriver = properties.getProperty(DB_DRIVER_KEY);
    LOG.debug(dbDriver);
    Class.forName(dbDriver);
    System.out.println("Driver loaded");
    connection = DriverManager.getConnection(
            properties.getProperty(DB_URL_KEY),
            properties.getProperty(DB_USER_KEY),
            properties.getProperty(DB_PASSWORD_KEY));
    LOG.debug("Database connected");
}

/**
 * Close the connections to the database
 */
public void shutdown() {
    if (connection != null) {
        try {
            connection.close();
            connection = null;
        } catch (SQLException e) {
            LOG.error(e.getMessage());
        }
    }
}

/**
 * Determine if the database table exists.
 * 
 * @param tableName
 * @return true is the table exists, false otherwise
 * @throws SQLException
 */
public static boolean tableExists(String tableName) throws SQLException {
    DatabaseMetaData databaseMetaData = getConnection().getMetaData();
    ResultSet resultSet = null;
    String rsTableName = null;

    try {
        resultSet = databaseMetaData.getTables(connection.getCatalog(),
                "%", "%", null);
        while (resultSet.next()) {
            rsTableName = resultSet.getString("TABLE_NAME");
            if (rsTableName.equalsIgnoreCase(tableName)) {
                return true;
            }
        }
    } finally {
        resultSet.close();
    }

    return false;
}

/**
 * @return the theinstance
 */
public static Database getInstance() {
    if(theInstance == null){
        theInstance = new Database();
    }
    return theInstance;
}

}

public class Database { public static final String DB_DRIVER_KEY = "db.driver"; public static final String DB_URL_KEY = "db.url"; public static final String DB_USER_KEY = "db.user"; public static final String DB_PASSWORD_KEY = "db.password"; private static Logger LOG = Logger.getLogger(Database.class.getName()); private static Database theInstance; private static Connection connection; private static Properties properties; private Database() { } public static void init(Properties properties) { if (Database.properties == null) { LOG.debug("Loading database properties from db.properties"); Database.properties = properties; } } public static Connection getConnection() throws SQLException { if (connection != null) { return connection; } try { connect(); } catch (ClassNotFoundException e) { throw new SQLException(e); } return connection; } private static void connect() throws ClassNotFoundException, SQLException { String dbDriver = properties.getProperty(DB_DRIVER_KEY); LOG.debug(dbDriver); Class.forName(dbDriver); System.out.println("Driver loaded"); connection = DriverManager.getConnection( properties.getProperty(DB_URL_KEY), properties.getProperty(DB_USER_KEY), properties.getProperty(DB_PASSWORD_KEY)); LOG.debug("Database connected"); } /** * Close the connections to the database */ public void shutdown() { if (connection != null) { try { connection.close(); connection = null; } catch (SQLException e) { LOG.error(e.getMessage()); } } } /** * Determine if the database table exists. * * @param tableName * @return true is the table exists, false otherwise * @throws SQLException */ public static boolean tableExists(String tableName) throws SQLException { DatabaseMetaData databaseMetaData = getConnection().getMetaData(); ResultSet resultSet = null; String rsTableName = null; try { resultSet = databaseMetaData.getTables(connection.getCatalog(), "%", "%", null); while (resultSet.next()) { rsTableName = resultSet.getString("TABLE_NAME"); if (rsTableName.equalsIgnoreCase(tableName)) { return true; } } } finally { resultSet.close(); } return false; } /** * @return the theinstance */ public static Database getInstance() { if(theInstance == null){ theInstance = new Database(); } return theInstance; }