Commit 33d7430d97cab08ef9f00e478c714c69caa2e23e

Authored by 杨鸣坤
1 parent 94756eaf

不同数据库类型兼容

... ... @@ -317,6 +317,18 @@
317 317 <artifactId>jsch</artifactId>
318 318 <version>0.1.55</version>
319 319 </dependency>
  320 + <!-- Oracle JDBC -->
  321 + <dependency>
  322 + <groupId>com.oracle.database.jdbc</groupId>
  323 + <artifactId>ojdbc8</artifactId>
  324 + <version>21.5.0.0</version>
  325 + </dependency>
  326 + <!-- SQLServer JDBC -->
  327 + <dependency>
  328 + <groupId>com.microsoft.sqlserver</groupId>
  329 + <artifactId>mssql-jdbc</artifactId>
  330 + <version>12.4.0.jre11</version>
  331 + </dependency>
320 332 </dependencies>
321 333 <build>
322 334 <plugins>
... ...
dao/src/main/java/org/thingsboard/server/dao/yunteng/impl/BaseDbConnectServiceImpl.java renamed from dao/src/main/java/org/thingsboard/server/dao/yunteng/impl/MySqlDbConnectServiceImpl.java
... ... @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
11 11 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectDTO;
12 12 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSshDTO;
13 13 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSslDTO;
  14 +import org.thingsboard.server.common.data.yunteng.enums.DbConnectTypeEnum;
14 15 import org.thingsboard.server.dao.yunteng.service.BaseDbConnectService;
15 16
16 17 import javax.net.ssl.SSLContext;
... ... @@ -23,11 +24,11 @@ import java.util.List;
23 24 import java.util.Properties;
24 25
25 26 /**
26   - * mySql类型数据库连接查询
  27 + * 最终数据库连接查询
27 28 */
28   -@Service("MySql")
29 29 @Slf4j
30   -public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
  30 +@Service("baseConnect")
  31 +public class BaseDbConnectServiceImpl implements BaseDbConnectService {
31 32
32 33 private static SSLContext sslContext = null;
33 34
... ... @@ -47,6 +48,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
47 48 }
48 49
49 50 private Object sshAndSslConnect(TkDbConnectDTO tkDbConnectDTO) {
  51 + // 只有mySql类型可以配置ssl通道
  52 + if (!DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  53 + return sshConnect(tkDbConnectDTO);
  54 + }
  55 +
50 56 try {
51 57 // 1. 建立SSH隧道
52 58 int localPort = setupSSHTunnel(tkDbConnectDTO.getSsh(), tkDbConnectDTO);
... ... @@ -56,9 +62,9 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
56 62 sslContext = createSSLContext(ssl.getClientCert(), ssl.getClientKey());
57 63 }
58 64
59   - String jdbcUrl = "jdbc:mysql://localhost:" + localPort + "/" + tkDbConnectDTO.getDbName() +
60   - "?useSSL=true" +
61   - "&requireSSL=true" +
  65 + String jdbcUrl = "jdbc:mysql://localhost:" +
  66 + localPort + "/" + tkDbConnectDTO.getDbName() +
  67 + "?useSSL=true" + "&requireSSL=true" +
62 68 "&verifyServerCertificate=" + ssl.isVerifyCaCert() +
63 69 "&enabledTLSProtocols=TLSv1.2,TLSv1.3";
64 70 tkDbConnectDTO.setUrl(jdbcUrl);
... ... @@ -72,6 +78,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
72 78 }
73 79
74 80 private Object sslConnect(TkDbConnectDTO tkDbConnectDTO) {
  81 + // 只有mySql类型可以配置ssl通道
  82 + if (!DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  83 + return commonConnect(tkDbConnectDTO);
  84 + }
  85 +
75 86 try {
76 87 TkDbConnectSslDTO ssl = tkDbConnectDTO.getSsl();
77 88 // 配置SSL
... ... @@ -113,7 +124,22 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
113 124 try {
114 125 // 1. 建立SSH隧道
115 126 int localPort = setupSSHTunnel(tkDbConnectDTO.getSsh(), tkDbConnectDTO);
116   - tkDbConnectDTO.setUrl("jdbc:mysql://localhost:" + localPort + "/" + tkDbConnectDTO.getDbName());
  127 + StringBuilder stringBuilder = new StringBuilder();
  128 + if (DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  129 + stringBuilder.append("jdbc:mysql://localhost:")
  130 + .append(localPort).append("/").append(tkDbConnectDTO.getDbName());
  131 + } else if (DbConnectTypeEnum.Postgresql.equals(tkDbConnectDTO.getType())) {
  132 + stringBuilder.append("jdbc:postgresql://localhost:")
  133 + .append(localPort).append("/").append(tkDbConnectDTO.getDbName());
  134 + } else if (DbConnectTypeEnum.Oracle.equals(tkDbConnectDTO.getType())) {
  135 + stringBuilder.append("jdbc:oracle:thin:@//localhost:")
  136 + .append(localPort).append("/").append(tkDbConnectDTO.getDbName());
  137 + } else if (DbConnectTypeEnum.SQLServer.equals(tkDbConnectDTO.getType())) {
  138 + stringBuilder.append("jdbc:sqlserver://localhost:")
  139 + .append(localPort).append(";databaseName=").append(tkDbConnectDTO.getDbName());
  140 + }
  141 +
  142 + tkDbConnectDTO.setUrl(stringBuilder.toString());
117 143 return commonConnect(tkDbConnectDTO);
118 144 } catch (Exception e) {
119 145 log.info("sshConnect occur error!", e);
... ... @@ -158,7 +184,15 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
158 184 config.setJdbcUrl(tkDbConnectDTO.getUrl());
159 185 config.setUsername(tkDbConnectDTO.getUserName());
160 186 config.setPassword(tkDbConnectDTO.getPassword());
161   - config.setDriverClassName("com.mysql.cj.jdbc.Driver");
  187 + if (DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  188 + config.setDriverClassName("com.mysql.cj.jdbc.Driver");
  189 + } else if (DbConnectTypeEnum.Postgresql.equals(tkDbConnectDTO.getType())) {
  190 + config.setDriverClassName("org.postgresql.Driver");
  191 + } else if (DbConnectTypeEnum.Oracle.equals(tkDbConnectDTO.getType())) {
  192 + config.setDriverClassName("oracle.jdbc.driver.OracleDriver");
  193 + } else if (DbConnectTypeEnum.SQLServer.equals(tkDbConnectDTO.getType())) {
  194 + config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
  195 + }
162 196
163 197 // SSL配置
164 198 if (sslContext != null) {
... ...
... ... @@ -119,6 +119,6 @@ public class TkDbConnectServiceImpl extends AbstractBaseService<TkDbConnectMappe
119 119 }
120 120
121 121 dbDto.setSql(tkDbConnectDTO.getSql());
122   - return connectServiceFactory.getService(dbDto.getType().toString()).connect(dbDto);
  122 + return connectServiceFactory.getService("baseConnect").connect(dbDto);
123 123 }
124 124 }
... ...