Pārlūkot izejas kodu

租户初始化数据库携带基础信息表(mysql)

韩帛霖 1 gadu atpakaļ
vecāks
revīzija
10e533185b

+ 5 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SqlInterceptor.java

@@ -31,6 +31,11 @@ public class SqlInterceptor implements Interceptor {
 
     // 根据类型设置不同的选择数据源格式
     private String modifySql(String sql) {
+        try {
+            SecurityUtils.getDatabaseType();
+        } catch (Exception e) {
+            return sql;
+        }
         if (SecurityUtils.getDatabaseType().equals("sqlserver"))
             return "USE `" + SecurityUtils.getDatabaseName() + "`; " + sql;
         if (SecurityUtils.getDatabaseType().equals("dm"))

+ 81 - 127
zkqy-datamodeling/src/main/java/com/zkqy/datamodeling/service/impl/TableInfoServiceImpl.java

@@ -326,8 +326,8 @@ public class TableInfoServiceImpl implements ITableInfoService {
             return stringBuilder.toString();
         }).collect(Collectors.toList());
 
-        //备份要删除的表sql
-        String backupSql = tableInfoMapper.backupTableSql(databaseName,tableName).get("Create Table");
+        // 暂存要删除的表sql
+        String backupSql = tableInfoMapper.backupTableSql(databaseName, tableName).get("Create Table");
         try {
             tableInfoMapper.updateMysqlTable(databaseName, tableName, tableComment, list);
         } catch (Exception e) {
@@ -614,24 +614,34 @@ public class TableInfoServiceImpl implements ITableInfoService {
     public AjaxResult initDatabase(DataSource dataSource) {
         RestTemplate restTemplate = new RestTemplate();
         //创建连接
-        Connection con;
-        Statement st;
+        Connection tenantCon;
+        Statement tenantSt;
         String driverName = null;
         String dbURL = null;
         String userName = dataSource.getUsername();
         String userPwd = dataSource.getPassword();
-
+        // 基础模版信息库
         String foundationDriverName = null;
-        String foundationDBURL = null;
-        String foundationUserName = dataSource.getUsername();
-        String foundationUserPwd = dataSource.getPassword();
-
+        String foundationDBURL = "";
+        String foundationUserName = "";
+        String foundationUserPwd = "";
+        String foundationSQL = "";
+        String foundationENDSQL = "";
 
         //查询数据库sql
         String showDatabaseSql = null;
         //创建数据库
         String createDatabaseSql = null;
-
+        // 基础模版信息
+        Map<String, Object> infoMap = new HashMap<>();
+        // 得到mysql的基础数据表模版
+        String ret = restTemplate.getForObject(dictIp + dataSource.getDatabaseType() + "_connection_information", String.class);
+        // 得到基础模版库的连接信息
+        Map<String, List<Map<String, Object>>> retMap = (Map<String, List<Map<String, Object>>>) JSON.parse(ret);
+        retMap.get("data").forEach(item ->
+        {
+            infoMap.put(item.get("dictLabel").toString(), item.get("dictValue"));
+        });
         //判断数据源,初始化对应创建信息
         switch (dataSource.getDatabaseType()) {
             case "mysql":
@@ -639,155 +649,99 @@ public class TableInfoServiceImpl implements ITableInfoService {
                 dbURL = "jdbc:mysql://" + dataSource.getDatabaseIp() + ":" + dataSource.getPortNumber();
                 showDatabaseSql = "show DATABASES";
                 createDatabaseSql = "CREATE DATABASE IF NOT EXISTS `" + dataSource.getDatabaseName() + "` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;";
-                // 得到mysql的基础数据表模版
-                String ret = restTemplate.getForObject(dictIp + "mysql_connection_information", String.class);
-                // 得到基础模版库的连接信息
-                Map<String, List<Map<String, Object>>> retMap = (Map<String, List<Map<String, Object>>>) JSON.parse(ret);
-                retMap.get("data").forEach(item -> {
-
-                });
-
-
-                // 建立连接查询得到所有表以及所有表信息
-
-
-                // 封装数据,执行创建表操作
-
-
+                // 封装mysql基础库信息连接信息
+                foundationDriverName = "com.mysql.cj.jdbc.Driver";
+                foundationDBURL += "jdbc:mysql://" + infoMap.get("databaseIp") + ":" + infoMap.get("portNumber") + "/" + infoMap.get("databaseName") + "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
+                foundationUserName += infoMap.get("username");
+                foundationUserPwd += infoMap.get("password");
+                foundationSQL += "SHOW TABLES;";
+                foundationENDSQL += "SHOW CREATE TABLE `" + infoMap.get("databaseName") + "`.`tableName`";
                 break;
             case "sqlserver":
                 driverName = LoadDriverConstants.SQLSERVER;
                 dbURL = "jdbc:sqlserver://" + dataSource.getDatabaseIp() + ":" + dataSource.getPortNumber() + ";DatabaseName=;trustServerCertificate=true;";
                 showDatabaseSql = "select name from sys.databases";
                 createDatabaseSql = "CREATE DATABASE " + dataSource.getDatabaseName();
-                // 得到sqlserver的基础数据表模版
-
+                // 封装sqlserver基础库信息连接信息
+                foundationDriverName = "com.mysql.cj.jdbc.Driver";
+                foundationDBURL += "jdbc:sqlserver://" + infoMap.get("databaseIp") + ":" + infoMap.get("portNumber") + ";DatabaseName=" + infoMap.get("databaseName") + ";trustServerCertificate=true;";
+                foundationUserName += infoMap.get("username");
+                foundationUserPwd += infoMap.get("password");
                 break;
             case "dm":
                 driverName = LoadDriverConstants.DM;
                 dbURL = "jdbc:dm://" + dataSource.getDatabaseIp() + ":" + dataSource.getPortNumber();
                 showDatabaseSql = "select name from sysobjects where TYPE$='sch' and SUBTYPE$ is null";
                 createDatabaseSql = "CREATE SCHEMA " + dataSource.getDatabaseName();
-                // 得到dm的基础数据表模版
-
-
+                // 封装dm基础库信息连接信息
+                foundationDriverName = "com.mysql.cj.jdbc.Driver";
+                foundationDBURL += "jdbc:mysql://" + infoMap.get("databaseIp") + ":" + infoMap.get("portNumber") + "/" + infoMap.get("databaseName") + "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
+                foundationUserName += infoMap.get("username");
+                foundationUserPwd += infoMap.get("password");
                 break;
             case "oracle":
                 driverName = LoadDriverConstants.ORACLE;
                 dbURL = "jdbc:oracle:thin:@" + dataSource.getDatabaseIp() + ":" + dataSource.getPortNumber();
-                // 得到oracle的基础数据表模版
-
-
+                // 封装oracle基础库信息连接信息
+                foundationDriverName = "com.mysql.cj.jdbc.Driver";
+                foundationDBURL += "jdbc:mysql://" + infoMap.get("databaseIp") + ":" + infoMap.get("portNumber") + "/" + infoMap.get("databaseName") + "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
+                foundationUserName += infoMap.get("username");
+                foundationUserPwd += infoMap.get("password");
                 break;
             // 如果还有其他字段需要处理,可以继续添加case分支
             default:
                 break;
         }
-        if (true) return null;
         try {
+            // 建立数据源连接
             Class.forName(driverName);
-            con = DriverManager.getConnection(dbURL, userName, userPwd);
-            st = con.createStatement();
-
-
+            tenantCon = DriverManager.getConnection(dbURL, userName, userPwd);
+            tenantSt = tenantCon.createStatement();
             //查询所有数据库
-            ResultSet rs = st.executeQuery(showDatabaseSql);
-            while (rs.next()) {//如果对象中有数据,就会循环打印出来
-                System.out.println(rs.getString(1));
-                if (rs.getString(1).equals(dataSource.getDatabaseName())) {
+            ResultSet tenantRs = tenantSt.executeQuery(showDatabaseSql);
+            while (tenantRs.next()) {//如果对象中有数据,就会循环打印出来
+                System.out.println(tenantRs.getString(1));
+                if (tenantRs.getString(1).equals(dataSource.getDatabaseName())) {
                     return AjaxResult.warn("数据库已存在!");
                 }
             }
             //创建数据库
-            st.executeUpdate(createDatabaseSql);
+            tenantSt.executeUpdate(createDatabaseSql);
+            // 建立连接查询得到所有表以及所有表信息
+            Class.forName(foundationDriverName);
+            Connection foundationCon = DriverManager.getConnection(foundationDBURL, foundationUserName, foundationUserPwd);
+            Statement foundationSt = foundationCon.createStatement();
+            //查询当前库中的所有表信息
+            ResultSet foundationRs = foundationSt.executeQuery(foundationSQL);
+
+            List<String> tableNameList = new ArrayList<>();
+            // 封装数据,执行创建表操作
+            while (foundationRs.next()) {
+                // 得到结果集->表名称
+                tableNameList.add(foundationRs.getString(1));
+            }
+            // 选择执行的sql语句
+            tenantSt.executeUpdate("USE `" + dataSource.getDatabaseName() + "`");
+            for (int i = 0; i < tableNameList.size(); i++) {
+                // 根据表名得到当前表结构信息
+                ResultSet structureRs = foundationSt.executeQuery(foundationENDSQL.replace("tableName", tableNameList.get(i)));
+                while (structureRs.next()) {
+                    // 增加租户基础表
+                    tenantSt.executeUpdate(structureRs.getString(2));
+                }
+            }
+            // 关闭数据库连接
+            tenantRs.close();
+            tenantSt.close();
+            tenantCon.close();
+            /////////////////
+            foundationRs.close();
+            foundationSt.close();
+            foundationCon.close();
         } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.warn("初始化数据库异常,请确保连接信息无误!");
         }
         return AjaxResult.success();
     }
-
-
-    public static void asd() throws Exception {
-        //Class.forName("dm.jdbc.driver.DmDriver");
-        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
-        try (
-                //sqlserver
-                Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test;trustServerCertificate=true;", "sa", "root1234");
-                //达梦
-                // Connection con = DriverManager.getConnection("jdbc:dm://192.168.110.52:5236", "sysdba", "sysdba1234");
-                JdbcRowSet jrs = new JdbcRowSetImpl(con);
-        ) {
-
-            //查询达梦数据库
-            //jrs.setCommand("select name from sysobjects where TYPE$='sch' and SUBTYPE$ is null");
-
-            //查询sqlserver数据库
-            jrs.setCommand("select name from sys.databases;");
-            jrs.execute();
-
-            while (jrs.next()) {
-                System.out.println(jrs.getString(1));
-//                System.out.println(jrs.getString(1) + "\t" + jrs.getString(2) + "\t" + jrs.getString(3));
-            }
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-
-        }
-    }
-
-    //创建数据库
-    public void aa() throws Exception {
-        Connection con;
-        Statement st;
-        String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
-        String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=;trustServerCertificate=true;";
-        String userName = "sa";
-        String userPwd = "root1234";
-
-        try {
-            Class.forName(driverName); //jdk版本6.0以上可以省略这句话
-            con = DriverManager.getConnection(dbURL, userName, userPwd);
-
-            st = con.createStatement();
-
-            //查询sql
-//            String sql= "select name from sys.databases;";
-//            ResultSet rs = st.executeQuery(sql);
-//            while(rs.next()){//如果对象中有数据,就会循环打印出来
-//                System.out.println(rs.getString(1));
-//            }
-
-            //创建数据库
-            String sql = "CREATE DATABASE hans;";
-            st.executeUpdate(sql);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-    }
-
-//    Connection con;
-//    Statement st;
-//    publicstatic void main(String [] args)
-//    {
-//        StringdriverName=”com.microsoft.sqlserver.jdbc.SQLServerDriver”;
-//        StringdbURL=”jdbc:sqlserver://localhost:1433;DatabaseName=你的数据库名”;
-//    String userName=”填写之前设置的用户名”;
-//        String userPwd=”填写密码”;
-//        String sql=“这里填写你想输入的SQL语句”;
-//        try
-//        {
-//            Class.forName(driverName); //jdk版本6.0以上可以省略这句话
-//            con=DriverManager.getConnection(dbURL,userName,userPwd);
-//            st=con.createStatement();
-//            st.executeUpdate(sql);
-//        }catch(Exception e)
-//        {
-//            e.printStackTrace();
-//        }
-//    }
-
 }