需求是每个租户有姓名和别名,姓名为中文,别名为英文简称,由新建租户时工具类自动生成入库,新建租户同时,会在数据库中添加租户对应需要的表(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