Commit 33d7430d97cab08ef9f00e478c714c69caa2e23e

Authored by 杨鸣坤
1 parent 94756eaf

不同数据库类型兼容

@@ -317,6 +317,18 @@ @@ -317,6 +317,18 @@
317 <artifactId>jsch</artifactId> 317 <artifactId>jsch</artifactId>
318 <version>0.1.55</version> 318 <version>0.1.55</version>
319 </dependency> 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 </dependencies> 332 </dependencies>
321 <build> 333 <build>
322 <plugins> 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,6 +11,7 @@ import org.springframework.stereotype.Service;
11 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectDTO; 11 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectDTO;
12 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSshDTO; 12 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSshDTO;
13 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSslDTO; 13 import org.thingsboard.server.common.data.yunteng.dto.TkDbConnectSslDTO;
  14 +import org.thingsboard.server.common.data.yunteng.enums.DbConnectTypeEnum;
14 import org.thingsboard.server.dao.yunteng.service.BaseDbConnectService; 15 import org.thingsboard.server.dao.yunteng.service.BaseDbConnectService;
15 16
16 import javax.net.ssl.SSLContext; 17 import javax.net.ssl.SSLContext;
@@ -23,11 +24,11 @@ import java.util.List; @@ -23,11 +24,11 @@ import java.util.List;
23 import java.util.Properties; 24 import java.util.Properties;
24 25
25 /** 26 /**
26 - * mySql类型数据库连接查询 27 + * 最终数据库连接查询
27 */ 28 */
28 -@Service("MySql")  
29 @Slf4j 29 @Slf4j
30 -public class MySqlDbConnectServiceImpl implements BaseDbConnectService { 30 +@Service("baseConnect")
  31 +public class BaseDbConnectServiceImpl implements BaseDbConnectService {
31 32
32 private static SSLContext sslContext = null; 33 private static SSLContext sslContext = null;
33 34
@@ -47,6 +48,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService { @@ -47,6 +48,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
47 } 48 }
48 49
49 private Object sshAndSslConnect(TkDbConnectDTO tkDbConnectDTO) { 50 private Object sshAndSslConnect(TkDbConnectDTO tkDbConnectDTO) {
  51 + // 只有mySql类型可以配置ssl通道
  52 + if (!DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  53 + return sshConnect(tkDbConnectDTO);
  54 + }
  55 +
50 try { 56 try {
51 // 1. 建立SSH隧道 57 // 1. 建立SSH隧道
52 int localPort = setupSSHTunnel(tkDbConnectDTO.getSsh(), tkDbConnectDTO); 58 int localPort = setupSSHTunnel(tkDbConnectDTO.getSsh(), tkDbConnectDTO);
@@ -56,9 +62,9 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService { @@ -56,9 +62,9 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
56 sslContext = createSSLContext(ssl.getClientCert(), ssl.getClientKey()); 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 "&verifyServerCertificate=" + ssl.isVerifyCaCert() + 68 "&verifyServerCertificate=" + ssl.isVerifyCaCert() +
63 "&enabledTLSProtocols=TLSv1.2,TLSv1.3"; 69 "&enabledTLSProtocols=TLSv1.2,TLSv1.3";
64 tkDbConnectDTO.setUrl(jdbcUrl); 70 tkDbConnectDTO.setUrl(jdbcUrl);
@@ -72,6 +78,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService { @@ -72,6 +78,11 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
72 } 78 }
73 79
74 private Object sslConnect(TkDbConnectDTO tkDbConnectDTO) { 80 private Object sslConnect(TkDbConnectDTO tkDbConnectDTO) {
  81 + // 只有mySql类型可以配置ssl通道
  82 + if (!DbConnectTypeEnum.MySql.equals(tkDbConnectDTO.getType())) {
  83 + return commonConnect(tkDbConnectDTO);
  84 + }
  85 +
75 try { 86 try {
76 TkDbConnectSslDTO ssl = tkDbConnectDTO.getSsl(); 87 TkDbConnectSslDTO ssl = tkDbConnectDTO.getSsl();
77 // 配置SSL 88 // 配置SSL
@@ -113,7 +124,22 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService { @@ -113,7 +124,22 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
113 try { 124 try {
114 // 1. 建立SSH隧道 125 // 1. 建立SSH隧道
115 int localPort = setupSSHTunnel(tkDbConnectDTO.getSsh(), tkDbConnectDTO); 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 return commonConnect(tkDbConnectDTO); 143 return commonConnect(tkDbConnectDTO);
118 } catch (Exception e) { 144 } catch (Exception e) {
119 log.info("sshConnect occur error!", e); 145 log.info("sshConnect occur error!", e);
@@ -158,7 +184,15 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService { @@ -158,7 +184,15 @@ public class MySqlDbConnectServiceImpl implements BaseDbConnectService {
158 config.setJdbcUrl(tkDbConnectDTO.getUrl()); 184 config.setJdbcUrl(tkDbConnectDTO.getUrl());
159 config.setUsername(tkDbConnectDTO.getUserName()); 185 config.setUsername(tkDbConnectDTO.getUserName());
160 config.setPassword(tkDbConnectDTO.getPassword()); 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 // SSL配置 197 // SSL配置
164 if (sslContext != null) { 198 if (sslContext != null) {
@@ -119,6 +119,6 @@ public class TkDbConnectServiceImpl extends AbstractBaseService<TkDbConnectMappe @@ -119,6 +119,6 @@ public class TkDbConnectServiceImpl extends AbstractBaseService<TkDbConnectMappe
119 } 119 }
120 120
121 dbDto.setSql(tkDbConnectDTO.getSql()); 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 }