我是Java
的新手:
我有以下程序使用Enum
连接到不同的数据库来调用不同的数据库连接。
我需要将凭据,用户名和密码单独放在一个类中,但我不确定,因为它们都是使用get和set初始化的,并且我可以使用它的唯一方法是在同一个方法中将它们称为
首先,我有一个初始化连接字符串和数据元素的类。
class DatabaseUtility {
private String USERNAME;
private String PASSWORD;
private String HSQLDB;
private String MYSQL;
public DatabaseUtility() {
USERNAME = null;
PASSWORD = null;
HSQLDB = null;
MYSQL = null;
}
public String getUsername() {
return USERNAME;
}
public void setUsername(String username) {
USERNAME = username;
}
public String getPassword() {
return PASSWORD;
}
public void setPassword(String password) {
PASSWORD = password;
}
public String getHsdbConn() {
return HSQLDB;
}
public void setHsdb(String hsdbConnection) {
HSQLDB = hsdbConnection;
}
public String getMySqlConn() {
return MYSQL;
}
public void setMySqlConn(String mySqlConnection) {
MYSQL = mySqlConnection;
}
}
接下来我使用enum
来调用两种数据库类型:
public enum DBType {
HSQLDB, MYSQL
}
接下来,我有一个方法,它使用switch语句根据main method
中的用户首选项分配不同的数据库连接。
*这是我的帖子的重点,我必须在这里调用get和set方法,我宁愿不在同一方法中设置凭据但不确定如何将两者分开。
import java.sql.*;
class DatabaseConnectivity {
DatabaseUtility dbUtil = new DatabaseUtility();
public Connection getConnection(DBType dbType) throws SQLException {
dbUtil.setHsdb("jdbc:hsqldb:data/explorecalifornia");
dbUtil.setMySqlConn("jdbc:mysql://jsa/explorecalifornia");
dbUtil.setUsername("dbuser");
dbUtil.setPassword("dbpassword");
switch (dbType) {
case MYSQL:
return DriverManager.getConnection(dbUtil.getMySqlConn(),
dbUtil.getUsername(), dbUtil.getPassword());
case HSQLDB:
return DriverManager.getConnection(dbUtil.getHsdbConn(),
dbUtil.getUsername(), dbUtil.getPassword());
default:
return null;
}
}
}
最后,这是主类,注意try catch block
中调用的DBType枚举。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MultiDatabaseConnectionMain {
public static void main(String[] args) throws SQLException {
DatabaseConnectivity databaseConnectivity = new DatabaseConnectivity();
Connection connection = null;
Statement statement = null;
ResultSet resultset = null;
try {
connection = databaseConnectivity.getConnection(DBType.MYSQL);
System.out.println("Connected");
System.out.println();
statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery("SELECT * FROM states");
resultset.last();
System.out.println("Number of rows: " + resultset.getRow());
} catch (SQLException e) {
System.err.println(e);
} finally {
if (resultset != null) {
resultset.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
}
答案 0 :(得分:1)
您可以在类DatabaseConnectivity
的构造函数中提供凭据,然后使用它们在DatabaseUtility
的实例中设置值。
class DatabaseConnectivity {
DatabaseUtility dbUtil;
public DatabaseConnectivity (String userName, String password) {
dbUtil = new DatabaseUtility();
dbUtil.setUsername(userName)
dbUtil.setPassword(password);
}
......
答案 1 :(得分:1)
我不是百分百肯定,但我认为你要问的是你必须用同样的方法调用dbUtil.set *和dbUtil.get *。
我建议您使用db属性创建枚举,因此无论dbType传递给参数,您都可以在其上调用getter。您可以按如下方式定义枚举。
public enum DBType {
//ser properties you want for db. url, username are just dummy values
HSQLDB("url", "username", "password"), MYSQL("url", "username", "password");
private String url;
private String username;
private String password;
private DBType(String url, String username, String password){
this.url = url;
//set other properties
}
public String getUrl(){
return this.url;
}
//getter for all the other values
}
并且在DatabaseConnectivity的getConnection方法中将
public Connection getConnection(DBType dbType) throws SQLException {
return DriverManager.getConnection(dbType.getUrl(),
dbType.getUsername(), dbType.getPasword());
}