Java如何對Oracle、mysql、postgresql等數據庫,動態測試是否連接成功並獲取連接

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)){

             urlnew 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;

      }

   }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章