创建租户数据库新建对应的表(初级)

需求是每个租户有姓名和别名,姓名为中文,别名为英文简称,由新建租户时工具类自动生成入库,新建租户同时,会在数据库中添加租户对应需要的表(mysql为例),表名为原始表加上租户别名而成  “sys_user+aliasName+” ,最终达到创建租户,同时创建所需对应的表。

工具类 ↓

package com.ruoyi.system.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @Description: TODO
 * @Author: GY
 * @Date: 2022/10/11/011
 **/
@Component 
//@PropertySource({"classpath:bootstrap.yml"})
public class NewInitSysAdminDivisions {
    /**
     * 如果配置文件没有在默认目录下,使用注解@PropertySource获取,下面演示的是在多配置文件中获取相同属性名的值,以后置为准
     * 单配置文件只要一个路径参数就可以
     */

    /**
     * 这里我自己配置在nacos上面的 数据库的一些参数,通过vlaue去取值
     */
        @Value(value = "${wenwen.datasource.driver-class-name}")
        private String driver;

        @Value(value = "${wenwen.datasource.url}")
        private String url;

        @Value(value = "${wenwen.datasource.username}")
        private String userName;

        @Value(value = "${wenwen.datasource.password}")
        private String password;

    /**
     * 
     * @param aliasName
     * @throws Exception
     * 新建数据库
     */
    @Transactional(rollbackFor =Exception.class)
        public void initTableByName(String aliasName) throws Exception {
            //连接数据库
            Class.forName(driver);
            //测试url中是否包含useSSL字段,没有则添加设该字段且禁用

            Connection conn = DriverManager.getConnection(url, userName, password);
            Statement stat = conn.createStatement();

            ResultSet rs = conn.getMetaData().getTables(null, null, "sys_user_"+aliasName+"", null);

            // 判断表是否存在,如果存在则什么都不做,否则创建表
            if(rs.next()){
                throw new Exception("租户表已存在,无法继续创建");
            }
            else {
                //生成用户表 复制原始表结构
                stat.executeUpdate(
                        "CREATE TABLE sys_user_"+aliasName+" SELECT * FROM sys_user WHERE 1=2"
                );

                stat.executeUpdate(
                        "CREATE TABLE sys_dept_"+aliasName+" SELECT * FROM sys_dept WHERE 1=2"
                );
            }
            // 释放资源
            stat.close();
            conn.close();
        }

    /**
     * 
     * @param newAliasName
     * @param oldAliasName
     * @throws Exception
     * 修改数据库 这里需要传两个参数 旧别名和新别名,进行替换 
     * 这里可能有点绕 点击修改 输入新别名 传入后台,后台通过新别名获取到租户id 此时新别名还未入库,可以取到租户对应id。
     * 通过id查到旧别名 再把两个别名传入修改对应表名
     */
        @Transactional(rollbackFor =Exception.class)
        public void updateTableByName(String newAliasName,String oldAliasName) throws Exception {
            //连接数据库
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, userName, password);
            Statement stat = conn.createStatement();
            /**
             * 大管理员创建租户
             * 新增完成,获取到租户id
             * init方法 形参传入租户id
             * 根据租户id 获取租户姓名 拼接入表名 自动生成
             */
            ResultSet rs = conn.getMetaData().getTables(null, null, "sys_user_"+newAliasName+"", null);

            // 判断表是否存在,如果不存在则返回异常信息,否则修改表
            if(rs.next()){
                throw new Exception("租户表存在,无法进行修改");
            }
            else {
                //修改用户表
                stat.executeUpdate(
                        "alter table sys_user_"+oldAliasName+" rename sys_user_"+newAliasName+""
                );
                stat.executeUpdate(
                        "alter table sys_dept_"+oldAliasName+" rename  sys_dept_"+newAliasName+""
                );
            }
            // 释放资源
            stat.close();
            conn.close();
        }

    /**
     * 
     * @param aliasName
     * @throws Exception
     * 删除
     */
    @Transactional(rollbackFor =Exception.class)
        public void deleteTableByName(String aliasName) throws Exception {
            //连接数据库
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, userName, password);
            Statement stat = conn.createStatement();

            /**
             * 大管理员创建租户
             * 新增完成,获取到租户id
             * init方法 形参传入租户id
             * 根据租户id 获取租户姓名 拼接入表名 自动生成
             */
            ResultSet rs = conn.getMetaData().getTables(null, null, "sys_user_"+aliasName+"", null);

            // 判断表是否存在,如果不存在则返回异常信息,否则修改表
            if(!rs.next()){
                throw new Exception("租户不表存在,无法删除");
            }
            else {
                stat.executeUpdate(
                        "DROP TABLE sys_user_"+aliasName+", sys_dept_"+aliasName+""
                );
            }
            // 释放资源
            stat.close();
            conn.close();
        }
    }

说一下修改,我目前做的租户没有替代登录用户user的功能,所以暂时无法从用户信息中取值,用的方法比较麻烦,后续可以再修改,目前的修改方法如下

 那现在我们试一下基础的 CRUD功能 看看对应的库有没有变化,我默认操作是两张表,复制结构生成,不复制数据。sys_user  sys_dept  待会我们看看对应的表有无新变化

新增

 

 

 

 对应的库也出来了

修改

 

 

修改成功 

删除

 

 对应的表只剩下基础的了,到这里基本功能可以实现,不考虑性能速度前提,是一个思路。

这是汉字转英文的工具类,没有可以拷贝自己试一试 ,测验一下https://blog.csdn.net/wwenteacher/article/details/127283923?spm=1001.2014.3001.5501

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值