韩帛霖 1 жил өмнө
parent
commit
a7cf5393bb

+ 3 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/DataSourceController.java

@@ -27,13 +27,12 @@ public class DataSourceController {
     /**
      * 根据数据源类型得到当前数据源下所有数据库
      *
-     * @param type 数据源类型
+     * @param dataSource 数据源信息
      * @return
      */
     @GetMapping("/querySelectDataSource")
-    public AjaxResult querySelectDataSource(String type) {
-        return AjaxResult.success(dataSourceService.querySelectDatasource(type));
+    public AjaxResult querySelectDataSource(DataSource dataSource) throws Exception {
+        return AjaxResult.success(dataSourceService.querySelectDatasource(dataSource));
     }
 
-
 }

+ 10 - 4
ruoyi-common/src/main/java/com/ruoyi/common/config/datamodeling/DynamicDataSource.java

@@ -71,7 +71,7 @@ public class DynamicDataSource extends AbstractRoutingDataSource {
      * @throws NoSuchFieldException
      * @throws IllegalAccessException
      */
-    public boolean changeDataSource(GenConfig genConfig) throws NoSuchFieldException, IllegalAccessException {
+    public boolean changeDataSource(GenConfig genConfig, boolean isStateScode) throws NoSuchFieldException, IllegalAccessException {
         String url = genConfig.url;
         String driverClassName = genConfig.driverClassName;
         String username = genConfig.username;
@@ -84,10 +84,10 @@ public class DynamicDataSource extends AbstractRoutingDataSource {
          */
         if (DataSourceType.ORACLE.getDataSourceName().equals(dbtype)) {
             dbName = url.substring(url.lastIndexOf(":") + 1);
-        }else if(DataSourceType.SQLSERVER.getDataSourceName().equals(dbtype)){
+        } else if (DataSourceType.SQLSERVER.getDataSourceName().equals(dbtype)) {
             dbName = url.substring(url.indexOf("DatabaseName=") + 13);
             url += UrlSuffix.SQLSERVER;
-        }else if(DataSourceType.DM.getDataSourceName().equals(dbtype)){
+        } else if (DataSourceType.DM.getDataSourceName().equals(dbtype)) {
             dbName = url.substring(url.lastIndexOf("=") + 1);
         } else {
             dbName = url.substring(url.lastIndexOf("/") + 1);
@@ -121,12 +121,18 @@ public class DynamicDataSource extends AbstractRoutingDataSource {
         super.afterPropertiesSet();
         // 切换数据源
         setDataSource(dbtype);
+
+        // 校验是否切换数据源信息
+        if (isStateScode) {
+            return true;
+        }
+
         /*
          ** 修改mybatis的数据源
          * !!!重要,不修改mybatis的数据源的话,
          * 即使切换了数据源之后还是会出现默认数据源的情况
          */
-        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)SpringContextUtils.getBean(SqlSessionFactory.class);
+        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringContextUtils.getBean(SqlSessionFactory.class);
         Configuration configuration = sqlSessionFactory.getConfiguration();
         /*
          * !!!重要,设置databaseId,用于在mapper.xml中找到对应的_databaseId,

+ 40 - 0
ruoyi-common/src/main/java/com/ruoyi/common/config/datamodeling/GenConfig.java

@@ -27,6 +27,38 @@ public class GenConfig {
      */
     public String dbtype;
 
+    /**
+     * 当前切换数据源切换是否替换当前连接数据源
+     * true:不替换
+     * false:替换
+     */
+    public boolean stateScode;
+
+    public GenConfig() {
+
+    }
+
+    public GenConfig(String driverClassName, String url, String username, String password, String dbtype, boolean stateScode) {
+        this.driverClassName = driverClassName;
+        this.url = url;
+        this.username = username;
+        this.password = password;
+        this.dbtype = dbtype;
+        this.stateScode = stateScode;
+    }
+
+    @Override
+    public String toString() {
+        return "GenConfig{" +
+                "driverClassName='" + driverClassName + '\'' +
+                ", url='" + url + '\'' +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                ", dbtype='" + dbtype + '\'' +
+                ", stateScode=" + stateScode +
+                '}';
+    }
+
     public String getDriverClassName() {
         return driverClassName;
     }
@@ -66,4 +98,12 @@ public class GenConfig {
     public void setDbtype(String dbtype) {
         this.dbtype = dbtype;
     }
+
+    public boolean isStateScode() {
+        return stateScode;
+    }
+
+    public void setStateScode(boolean stateScode) {
+        this.stateScode = stateScode;
+    }
 }

+ 2 - 2
zkqy-datamodeling/src/main/java/com/zkqy/datamodeling/service/IDataSourceService.java

@@ -16,9 +16,9 @@ public interface IDataSourceService {
     /**
      * 得到当前数据源下的所有库信息
      *
-     * @param type 数据源类型
+     * @param dataSource 数据源信息
      * @return
      */
-    List<String> querySelectDatasource(String type);
+    List<String> querySelectDatasource(DataSource dataSource) throws Exception;
 
 }

+ 5 - 5
zkqy-datamodeling/src/main/java/com/zkqy/datamodeling/service/impl/DataSourceServiceImpl.java

@@ -23,20 +23,21 @@ public class DataSourceServiceImpl implements IDataSourceService {
 
     @Override
     public void changeDataSource(DataSource dataSource) throws Exception {
-
         //切换数据源之前先清空
         DynamicDataSource.clearDataSource();
         //切换数据源
-        dynamicDataSource.changeDataSource(DataSourceUtils.changeDataSource(dataSource));
+        dynamicDataSource.changeDataSource(DataSourceUtils.changeDataSource(dataSource), false);
         // redisTemplate.opsForValue().set("DataSource", JSON.toJSONString(dataSource));
         System.err.println("当前数据源:" + dataSource.toString());
     }
 
     @Override
-    public List<String> querySelectDatasource(String type) {
+    public List<String> querySelectDatasource(DataSource dataSource) throws Exception {
         List<String> retList = new ArrayList<>();
+        // 在执行前需要创建数据源
+        dynamicDataSource.changeDataSource(DataSourceUtils.changeDataSource(dataSource), true);
         // 得到当前数据源中的所有库信息
-        switch (type) {
+        switch (dataSource.getDatabaseType()) {
             case "mysql":
                 retList = dataSourceMapper.querySelectDatasource("SHOW DATABASES;");
                 break;
@@ -50,7 +51,6 @@ public class DataSourceServiceImpl implements IDataSourceService {
                 retList = dataSourceMapper.querySelectDatasource("SELECT DISTINCT object_name FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'SCH';");
                 break;
         }
-        System.out.println(retList);
         return retList;
     }