多租户独立数据库解决方案思路:mybatis执行sql文件,java的文件复制,重命名

现在有个需求是做的这套系统要能实现多个公司使用,每个公司要有不同的数据库,之前从来没做过类似的,思路是:
后台管理页面输入新增公司信息,包括一下这些信息:
‘主键id’,‘企业名称’,企业logo’, ‘联系人’,‘联系电话’, ‘二级域名’,‘管理员账号’, ‘管理员密码’, 数据库名
在执行提交的时候,服务器以数据库名创建数据库,然后执行转储的sql文件来建立所有的表,这个sql文件是放在特定盘符下的,每次提交新增公司信息时候,会复制这个sql文件并且重命名,再执行这个sql,下面是service层的实现过程:

public boolean createDb(String dbName) throws IOException, ClassNotFoundException, SQLException {
    
    

         String driver = "com.mysql.jdbc.Driver";
         String url = "jdbc:mysql://xxxx:3306/"+dbName+"?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
         String username = "root";
         String password = "root";

        boolean db = manageMapper.createDb(dbName);

        //关联要复制的文件
        File file = new File("D:/db6666.sql");
        //建立输入流读取(这里的异常直接抛出去不处理)
        FileInputStream fis = new FileInputStream(file);
        //建立输出流用于复制出去,这里是要复制出去的地方以及文件名
        //这里填写要到什么地方,什么名字,什么后缀名就是了
        FileOutputStream fos = new FileOutputStream("D:/"+dbName+".sql");
        //定义变量接收读进来的数据
        byte[] temp = new byte[fis.available()];
        //读进来
        //定义变量接收
        int b;
        //循环接收数据
        for (int i = 0; i < temp.length; i++) {
    
    
            b = fis.read();
            temp[i] = (byte)b;
        }
        //复制出去
        fos.write(temp);
        //关闭流
        fis.close();
        fos.close();

        
        File sql = new File("D:/"+dbName+".sql");
        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, username, password);
        ScriptRunner runner = new ScriptRunner(conn);
        try {
    
    
            runner.setStopOnError(true);
            runner.runScript(new FileReader(sql));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        conn.close();

        return db;
    }

数据库连接信息,在url里面一定要把数据库名改为传进来的需要新建的参数

String driver = "com.mysql.jdbc.Driver";
         String url = "jdbc:mysql://xxxx:3306/"+dbName+"?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
         String username = "root";
         String password = "root";

先去创建数据库,

   boolean db = manageMapper.createDb(dbName);

创建数据库的xml文件如下:

 <update id="createDb">
            create database ${
    
    dbName};
     </update>

注释很详细了,主要是把原文件复制并且重命名

//关联要复制的文件
        File file = new File("D:/db6666.sql");
        //建立输入流读取(这里的异常直接抛出去不处理)
        FileInputStream fis = new FileInputStream(file);
        //建立输出流用于复制出去,这里是要复制出去的地方以及文件名
        //这里填写要到什么地方,什么名字,什么后缀名就是了
        FileOutputStream fos = new FileOutputStream("D:/"+dbName+".sql");
        //定义变量接收读进来的数据
        byte[] temp = new byte[fis.available()];
        //读进来
        //定义变量接收
        int b;
        //循环接收数据
        for (int i = 0; i < temp.length; i++) {
    
    
            b = fis.read();
            temp[i] = (byte)b;
        }
        //复制出去
        fos.write(temp);
        //关闭流
        fis.close();
        fos.close();

下面就是执行sql文件的操作:

 File sql = new File("D:/"+dbName+".sql");
        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, username, password);
        ScriptRunner runner = new ScriptRunner(conn);
        try {
    
    
            runner.setStopOnError(true);
            runner.runScript(new FileReader(sql));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        conn.close();

        return db;
    }

在这里插入图片描述
提交的数据库名为baidu,创建了对应的sql文件
在这里插入图片描述.
sql文件创建了一张bus_clue表
在这里插入图片描述
再看数据库:成功创建
在这里插入图片描述
库是创建好了,后面的具体怎么做还没想好…

猜你喜欢

转载自blog.csdn.net/weixin_42260782/article/details/112554252