資料來源管理 | 基於JDBC模式,適配和管理動態資料來源
阿新 • • 發佈:2020-04-08
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent)
# 一、關係型資料來源
## 1、動態資料來源
![](https://img2020.cnblogs.com/blog/1691717/202004/1691717-20200407220621903-1604864869.png)
動態管理資料來源的基本功能:資料來源載入,容器維護,持久化管理。
## 2、關係型資料庫
不同廠商的關係型資料庫,提供的連結方式,驅動包,驅動類名都是不一樣的,Java資料庫連線API,JDBC是Java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法,且適配大部分關係型資料庫。
## 3、適配要素
核心要素:驅動包、驅動類名、URL格式、預設埠。
關係型資料庫很多,這裡一定是不全的,根據需要自行完善即可。
```java
public enum DataSourceType {
MySql("MySql", "com.mysql.jdbc.Driver"),
Oracle("Oracle", "oracle.jdbc.OracleDriver"),
DB2("DB2", "com.ibm.db2.jcc.DB2Driver");
private String dataSourceName;
private String driverClassName;
public static String getDriver (String dataSourceName) {
DataSourceType[] types = DataSourceType.values();
for (DataSourceType type : types) {
if (type.getDataSourceName().equals(dataSourceName)) {
return type.getDriverClassName();
}
}
return null;
}
DataSourceType (String dataSourceName,String driverClassName){
this.dataSourceName = dataSourceName ;
this.driverClassName = driverClassName ;
}
}
```
## 4、JDBC基礎API
**DriverManager**
管理JDBC驅動程式的基本服務API。呼叫方法Class.forName,顯式地載入驅動程式類,正好適用於動態資料來源的業務場景,資料來源型別未知情況。載入Driver類並在DriverManager類註冊後,即可用來與資料庫建立連線。
**DataSource**
DataSource介面,由驅動程式供應商實現,負責建立與資料庫的連線,當在應用程式中訪問資料庫時,常用於獲取操作資料的Connection物件。
**Connection**
Connection介面代表與特定的資料庫的連線,要對資料庫資料進行操作,首先要獲取資料庫連線,Connection實現就像在應用程式中與資料庫之間開通了一條通道,通過DriverManager類或DataSource類都可獲取Connection例項。
# 二、連結和管理
這裡幾個核心類的封裝思路:模組化功能,API分開封裝,如果需要適配處理各類資料來源型別,則分別可以向上抽象提取,向下自定義適配策略,設計模式影響下的基本意識。
## 1、連結工具
基於DriverManager管理資料來源的驅動載入,連結獲取等。
```java
public class ConnectionUtil {
public static synchronized Connection getConnect(String driverClassName,String userName,
String passWord,String jdbcUrl) {
Properties prop = new Properties();
prop.put("user", userName);
prop.put("password", passWord);
return connect(driverClassName,prop,jdbcUrl) ;
}
private static synchronized Connection connect(String driverClassName,
Properties prop,String jdbcUrl) {
try {
Class.forName(driverClassName);
DriverManager.setLoginTimeout(JdbcConstant.LOGIN_TIMEOUT);
return DriverManager.getConnection(jdbcUrl, prop);
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
```
## 2、API工具類
提供API配置獲取類,載入需要的資料來源API,關閉資源等基本操作。
```java
@Component
public class JdbcConfig {
/**
* 獲取資料來源連線
*/
public Connection getConnection (ConnectionEntity connectionEntity){
String dataTypeName = connectionEntity.getDataTypeName();
String driverClassName = DataSourceType.getDriver(dataTypeName) ;
if (driverClassName == null){
throw new RuntimeException("不支援該資料來源型別") ;
}
connectionEntity.setDriverClassName(driverClassName);
return ConnectionUtil.getConnect(connectionEntity.getDriverClassName(),
connectionEntity.getUserName(),
connectionEntity.getPassWord(),
connectionEntity.getJdbcUrl()) ;
}
}
```
## 3、資料來源容器
維護一個Map容器,管理資料來源的新增,刪除,動態獲取等基本需求。
```java
@Component
public class DataSourceFactory {
private vola