add
This commit is contained in:
@ -7,6 +7,7 @@ import com.qiaoba.common.base.constants.BaseConstant;
|
||||
import com.qiaoba.common.base.constants.TenantConstant;
|
||||
import com.qiaoba.common.base.context.BaseContext;
|
||||
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
||||
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
||||
import com.qiaoba.common.web.utils.ResponseUtil;
|
||||
import com.qiaoba.common.web.utils.UriUtil;
|
||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
||||
@ -91,12 +92,12 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
|
||||
if (sysTenant.getMode().equals(SysTenant.DATASOURCE_MODE)) {
|
||||
//设置当前租户对应的数据源
|
||||
BaseContext.setDataSource(sysTenant.getTenantId());
|
||||
BaseContext.setDatabaseType(DynamicDataSourceConfig.TENANT_DATASOURCE_TYPE_MAP.get(sysTenant.getTenantId()));
|
||||
BaseContext.setDatabaseType(TenantDbTypeContext.get(sysTenant.getTenantId()));
|
||||
}
|
||||
// 字段模式 or Schema模式-数据源选择默认数据源
|
||||
else {
|
||||
BaseContext.setDataSource(TenantConstant.DEFAULT_TENANT_ID);
|
||||
BaseContext.setDatabaseType(DynamicDataSourceConfig.TENANT_DATASOURCE_TYPE_MAP.get(TenantConstant.DEFAULT_TENANT_ID));
|
||||
BaseContext.setDatabaseType(TenantDbTypeContext.getDefault());
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
package com.qiaoba.module.tenant.init.impl;
|
||||
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.db.sql.SqlExecutor;
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import com.qiaoba.common.base.code.DatasourceErrorCode;
|
||||
import com.qiaoba.common.database.utils.SqlUtil;
|
||||
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
||||
import com.qiaoba.common.database.utils.DbUtil;
|
||||
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
|
||||
import com.qiaoba.module.tenant.init.InitTablesStrategy;
|
||||
import com.qiaoba.module.tenant.utils.DbUtil;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -23,21 +24,32 @@ import java.sql.SQLException;
|
||||
*/
|
||||
@Service
|
||||
public class MysqlInitTablesStrategy implements InitTablesStrategy {
|
||||
|
||||
public static final String CREATE_MYSQL_DB_SQL = "DROP DATABASE IF EXISTS `{}`;CREATE DATABASE `{}` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';";
|
||||
|
||||
@Override
|
||||
public TenantInitVo create(Connection conn, String schema) {
|
||||
|
||||
// 切换 Schema
|
||||
try {
|
||||
SqlUtil.runSql(conn, StrUtil.format("use `{}`;", schema));
|
||||
DbUtil.runScript(conn, "MySQL/table/base_tables");
|
||||
conn.commit();
|
||||
return new TenantInitVo(HttpStatus.HTTP_OK, null);
|
||||
// 创建库
|
||||
SqlExecutor.execute(conn, StrUtil.format(CREATE_MYSQL_DB_SQL, schema, schema));
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
IoUtil.close(conn);
|
||||
return new TenantInitVo(DatasourceErrorCode.CREATE_SCHEMA_ERROR.getCode(), e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
// 切换 Schema
|
||||
DbUtil.setSchema(TenantDbTypeContext.getDefault(), conn, schema);
|
||||
DbUtil.runScript(conn, "MySQL/table/base_tables");
|
||||
return new TenantInitVo(HttpStatus.HTTP_OK, null);
|
||||
} catch (SQLException e) {
|
||||
return new TenantInitVo(DatasourceErrorCode.SWITCH_SCHEMA_ERROR.getCode(), e.getMessage());
|
||||
} catch (IOException e) {
|
||||
return new TenantInitVo(DatasourceErrorCode.CREATE_TABLE_ERROR.getCode(), e.getMessage());
|
||||
} finally {
|
||||
IoUtil.close(conn);
|
||||
}
|
||||
|
||||
return new TenantInitVo(DatasourceErrorCode.CREATE_TABLE_ERROR.getCode(), null);
|
||||
}
|
||||
}
|
||||
|
@ -4,9 +4,10 @@ import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.qiaoba.common.base.code.DatasourceErrorCode;
|
||||
import com.qiaoba.common.base.constants.TenantConstant;
|
||||
import com.qiaoba.common.base.constants.BaseConstant;
|
||||
import com.qiaoba.common.base.enums.DataBaseEnum;
|
||||
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
||||
import com.qiaoba.common.database.context.PrimaryDatasourceContext;
|
||||
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
||||
import com.qiaoba.common.database.utils.JdbcUtil;
|
||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
@ -17,6 +18,7 @@ import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||
import com.qiaoba.module.tenant.service.SysTenantInitService;
|
||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.sql.Connection;
|
||||
@ -36,6 +38,8 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
||||
private final SysTenantService sysTenantService;
|
||||
private final SysTenantDatasourceService sysTenantDatasourceService;
|
||||
|
||||
@Value("${spring.application.name}")
|
||||
private String schemaPrefix;
|
||||
|
||||
@Override
|
||||
public TenantInitCheckVo check(String tenantId) {
|
||||
@ -77,11 +81,11 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
||||
if (SysTenant.SCHEMA_MODE.equals(sysTenant.getMode())) {
|
||||
Connection connection = null;
|
||||
try {
|
||||
String schema = "qiaoba-boot-2";
|
||||
String schema = schemaPrefix + BaseConstant.HYPHEN_JOIN_STR + tenantId;
|
||||
// 获取主库Connection 和 Schema
|
||||
DruidDataSource dataSource = (DruidDataSource) DynamicDataSourceConfig.PRIMARY_DATASOURCE_MAP.get(TenantConstant.DEFAULT_TENANT_ID);
|
||||
DruidDataSource dataSource = (DruidDataSource) PrimaryDatasourceContext.getDefault();
|
||||
connection = dataSource.getConnection();
|
||||
return InitTablesStrategyFactory.getStrategy(DynamicDataSourceConfig.TENANT_DATASOURCE_TYPE_MAP.get(TenantConstant.DEFAULT_TENANT_ID)).create(connection, schema);
|
||||
return InitTablesStrategyFactory.getStrategy(TenantDbTypeContext.getDefault()).create(connection, schema);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
|
@ -1,30 +0,0 @@
|
||||
package com.qiaoba.module.tenant.utils;
|
||||
|
||||
import org.apache.ibatis.jdbc.ScriptRunner;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
|
||||
/**
|
||||
* 数据库工具类
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/27 16:11
|
||||
*/
|
||||
public class DbUtil {
|
||||
|
||||
public static void runScript(Connection conn, String filePath) throws IOException {
|
||||
ClassPathResource resource = new ClassPathResource(filePath);
|
||||
File file = resource.getFile();
|
||||
FileReader reader = new FileReader(file);
|
||||
ScriptRunner scriptRunner = new ScriptRunner(conn);
|
||||
scriptRunner.setSendFullScript(true);
|
||||
scriptRunner.runScript(reader);
|
||||
reader.close();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user