1.添加 查询所有不包含项目ID的表名称 的方法。

This commit is contained in:
Wang Chen Chen
2023-11-22 12:03:40 +08:00
parent 5db4ff98aa
commit 148462f30b
4 changed files with 22 additions and 20 deletions

View File

@@ -140,7 +140,7 @@ public class ApiCmsProjectServiceImpl implements ApiCmsProjectService {
.collect( .collect(
Collectors.groupingBy( Collectors.groupingBy(
TenantAndProject::getTenantId, TenantAndProject::getTenantId,
Collectors.mapping(project -> project.getProjectId(), Collectors.toSet()) Collectors.mapping(TenantAndProject::getProjectId, Collectors.toSet())
) )
); );
} }

View File

@@ -1,9 +1,9 @@
package com.xaaef.molly.corems.mapper; package com.xaaef.molly.corems.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xaaef.molly.corems.entity.CmsProject; import com.xaaef.molly.corems.entity.CmsProject;
import com.xaaef.molly.corems.entity.TenantAndProject; import com.xaaef.molly.corems.entity.TenantAndProject;
import org.apache.ibatis.annotations.Select;
import java.util.Collection; import java.util.Collection;
import java.util.Set; import java.util.Set;
@@ -23,14 +23,9 @@ import java.util.Set;
public interface CmsProjectMapper extends BaseMapper<CmsProject> { public interface CmsProjectMapper extends BaseMapper<CmsProject> {
// 查询 数据库 所有的 表名称 // 查询 所有的 不包含 project_id 的表
@Select("SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE ())") @InterceptorIgnore(tenantLine = "true")
Set<String> selectListTableNames(); Set<String> selectListTableNamesByNotIncludeColumn(String column);
// 查询 所有的 包含 project_id 的表
@Select("SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE ()) AND COLUMN_NAME = #{column}")
Set<String> selectListTableNamesByIncludeColumn(String column);
// 根据 租户的数据名称 查询 项目列表。如: molly_master 、molly_google // 根据 租户的数据名称 查询 项目列表。如: molly_master 、molly_google

View File

@@ -40,17 +40,13 @@ public class ProjectTableRunner implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) { public void contextInitialized(ServletContextEvent sce) {
log.info("ProjectTableRunner Initialized ....."); log.info("ProjectTableRunner Initialized .....");
if (multiTenantProperties.getEnableProject()) { if (multiTenantProperties.getEnableProject()) {
// 查询 数据库 所有的 表名称 // 查询 所有的 不包含 project_id 的表
var tableNames = projectMapper.selectListTableNames(); Set<String> tableNames = projectMapper.selectListTableNamesByNotIncludeColumn(PROJECT_ID);
// 查询 数据库 所有包含“project_id”字段的 表名称
Set<String> includeColumnProjectId = projectMapper.selectListTableNamesByIncludeColumn(PROJECT_ID);
// 排除 包含 所有包含“project_id”字段的 表名称
tableNames.removeAll(includeColumnProjectId);
MbpConst.PROJECT_IGNORE_TABLES.addAll(tableNames);
// 从 CmsProject 实体类中。获取 CmsProject 在 mysql 中的表名称。 // 从 CmsProject 实体类中。获取 CmsProject 在 mysql 中的表名称。
String projectTableName = CmsProject.class.getAnnotation(TableName.class).value(); String projectTableName = CmsProject.class.getAnnotation(TableName.class).value();
// 添加 CmsProject 的表名称 // 删除 CmsProject 的表名称
MbpConst.PROJECT_IGNORE_TABLES.add(projectTableName); tableNames.add(projectTableName);
MbpConst.PROJECT_IGNORE_TABLES.addAll(tableNames);
log.info("ignore project_id intercept table name : \n{}", JsonUtils.toJson(MbpConst.PROJECT_IGNORE_TABLES)); log.info("ignore project_id intercept table name : \n{}", JsonUtils.toJson(MbpConst.PROJECT_IGNORE_TABLES));
} }
} }

View File

@@ -4,6 +4,17 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xaaef.molly.corems.mapper.CmsProjectMapper"> <mapper namespace="com.xaaef.molly.corems.mapper.CmsProjectMapper">
<select id="selectListTableNamesByNotIncludeColumn" resultType="java.lang.String">
SELECT *
FROM (SELECT DISTINCT TABLE_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = (SELECT DATABASE())) AS allTableName
WHERE allTableName.TABLE_NAME NOT IN (SELECT DISTINCT TABLE_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = (SELECT DATABASE())
AND COLUMN_NAME = #{column})
</select>
<resultMap id="tenantAndProjectMap" type="com.xaaef.molly.corems.entity.TenantAndProject"> <resultMap id="tenantAndProjectMap" type="com.xaaef.molly.corems.entity.TenantAndProject">
<id property="projectId" column="project_id"/> <id property="projectId" column="project_id"/>
@@ -13,7 +24,7 @@
<select id="selectListByTenantDbName" resultMap="tenantAndProjectMap"> <select id="selectListByTenantDbName" resultMap="tenantAndProjectMap">
<foreach collection="tenantDbNameList" item="item" separator="union"> <foreach collection="tenantDbNameList" item="item" separator="union">
select project_id, #{item} AS tenant_id from ${item}.cms_project SELECT project_id, #{item} AS tenant_id FROM ${item}.cms_project
</foreach> </foreach>
</select> </select>