Java如何對Oracle、mysql、postgresql等數據庫,動態測試是否連接成功並獲取連接
具體實現代碼如下:
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class ConnectionUtil {
/**
* @Title:
* @Description: 測試連接並獲取連接
* @param @throws Exception 參數說明
* @return Connection 返回類型
* @throws
*/
public static Connection getConnection(DataBaseInfo dataBaseInfo) throws Exception {
String driverName = null;
String strConn = null;
Connection conn = null;
DbType dbType = ConnectionUtil.matchDbType(dataBaseInfo.getDbType());
if(dbType == null){
return null;
}
String dbPass = dataBaseInfo.getDbPass();
if (StringUtils.isEmpty(dbPass)) {
throw new Exception("密碼不能爲空");
}
driverName = dbType.getDriverName();
strConn = matchUrl(dataBaseInfo.getDbType(), dataBaseInfo.getDbIp(), dataBaseInfo.getDbPort(), dataBaseInfo.getDbSid());
//加載去動
ConnectionUtil.loadDriver(driverName);
DriverManager.setLoginTimeout(5);
//獲取連接
conn = DriverManager.getConnection(strConn, dataBaseInfo.getDbUsername(), dataBaseInfo.getDbPass().trim());
if(conn == null){
throw new Exception("連接失敗");
}
return conn;
}
/**
* @Title: loadDriver
* @Description: 動態加載數據庫驅動
* @param driverName
* @throws SQLException
*/
public static void loadDriver(String driverName) throws SQLException {
switch(driverName) {
case "com.mysql.jdbc.Driver":
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
break;
case "oracle.jdbc.driver.OracleDriver":
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
break;
case "org.postgresql.Driver":
DriverManager.registerDriver(new org.postgresql.Driver());
break;
default:
break;
}
}
/**
* 返回匹配出的url
* @param type 數據庫類型
* @param ip 數據庫ip或主機名
* @param host 端口號
* @param sid 數據庫sid
* @return
*/
public static String matchUrl(String type, String ip, String port, String sid) {
String url = matchDbType(type).getConnectString();
url = url.replace("{ip}", ip).replace("{port}", port);
if(!StringUtils.isEmpty(port)) {
if(type.contains("DATABASE_MYSQL")) {
if(StringUtils.isBlank(sid)) {
url = url.replace("{sid}", "");
System.out.println("mysql數據庫實例可以 爲空");
}else{
url = url.replace("{sid}", sid);
}
}else {
url = url.replace("{sid}", sid);
}
//處理Mysql時間字段默認爲0000-00-00 00:00:00
if("DATABASE_MYSQL".equals(type)){
url = new StringBuilder(url).append("&zeroDateTimeBehavior=convertToNull").toString() ;
}
} else {
url = url.split("@")[0] +"@"+ ip;
}
return url;
}
/**
* @Title: matchDbType
* @Description: 根據數據類型匹配數據庫枚舉
* @param @param dbType
* @param @return 參數說明
* @return DbType 返回類型
* @throws
*/
public static DbType matchDbType(String dbType) {
if ("DATABASE_MYSQL".equals(dbType)) {
return DbType.mysql;
} else if ("DATABASE_ORACLE9I".equals(dbType)) {
return DbType.oracle;
} else if (".DATABASE_ORACLE".equals(dbType)) {
return DbType.oracle;
} else if ("DATABASE_POSTGRESQL".equals(dbType)) {
return DbType.postgresql;
}
return null;
}
public class DataBaseInfo implements Serializable{
private static final long serialVersionUID = -1237293134895162532L;
/**
* @Fields dbType : 數據庫類型
*/
private String dbType;
/**
* @Fields dbIp : 數據庫IP
*/
private String dbIp;
/**
* @Fields dbPort : 數據庫端口
*/
private String dbPort;
/**
* @Fields dbUsername : 用戶名稱
*/
private String dbUsername;
/**
* @Fields dbPass : 密碼
*/
private String dbPass;
/**
* @Fields dbSid :實例名稱
*/
private String dbSid;
/**
* @Fields conn : 數據庫連接
*/
@JsonIgnore
private Connection conn;
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
public String getDbIp() {
return dbIp;
}
public void setDbIp(String dbIp) {
this.dbIp = dbIp;
}
public String getDbPort() {
return dbPort;
}
public void setDbPort(String dbPort) {
this.dbPort = dbPort;
}
public String getDbUsername() {
return dbUsername;
}
public void setDbUsername(String dbUsername) {
this.dbUsername = dbUsername;
}
public String getDbPass() {
return dbPass;
}
public void setDbPass(String dbPass) {
this.dbPass = dbPass;
}
public String getDbSid() {
return dbSid;
}
public void setDbSid(String dbSid) {
this.dbSid = dbSid;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
}
public enum DbType {
/**
* @Fields mysql MYSQL數據庫
*/
mysql("com.mysql.jdbc.Driver","jdbc:mysql://{ip}:{port}/{sid}?useUnicode=true&characterEncoding=UTF-8"),
/**
* @Fields oracle9~12
*/
oracle("oracle.jdbc.driver.OracleDriver","jdbc:oracle:thin:@{ip}:{port}/{sid}"),
/**
* @Fields postgresql數據庫
*/
postgresql("org.postgresql.Driver","jdbc:postgresql://{ip}:{port}/{sid}" );
/**
* @Fields driverName : 驅動名
*/
private String driverName;
/**
* @Fields connectString : 連接字
*/
private String connectString;
private DbType(String driverName, String connectString) {
this.driverName = driverName;
this.connectString = connectString;
}
public String getDriverName() {
return driverName;
}
public String getConnectString() {
return connectString;
}
}
}