当前位置: 首页 > news >正文

树莓派做博客网站一键开发小程序

树莓派做博客网站,一键开发小程序,wordpress api 跨域,wordpress 域名更改需求描述: 在一个多租户系统中,通过 MyBatis 实现动态数据表分离。具体来说,您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样,每个租户的数据就可以存储在专属于它们的表中&#xf…

需求描述:

在一个多租户系统中,通过 MyBatis 实现动态数据表分离。具体来说,您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样,每个租户的数据就可以存储在专属于它们的表中,实现数据隔离。

需求细节:

  1. 拦截 SQL 语句:使用 MyBatis 的 @Intercepts 注解和 Interceptor 接口来拦截 SQL 语句。

  2. 修改表名:在 SQL 执行时,根据提供的租户 ID (tenantId) 动态地修改 SQL 语句中的表名。例如,如果原表名为 ALARM_RECORD_INFO,租户 ID 为 1001,则修改后的表名应为 ALARM_RECORD_INFO_1001

  3. 获取租户 ID:从 MyBatis Mapper 接口方法的参数中获取 tenantId。这是通过在 Mapper 接口的方法参数上使用 @Param("tenantId") 注解实现的。

  4. 配置:在 mybatis-config.xml 文件中配置拦截器,并指定需要根据租户 ID 分表的表名。

  5. 映射器文件 (AlarmRecordMapper.xml):定义 SQL 语句,尽管 SQL 中写的是原始表名,实际执行时,表名将根据租户 ID 被拦截器动态修改

实现

下面是实现一个 MyBatis 拦截器的完整代码,该拦截器会拦截 SQL 语句,在执行操作时动态地将表名根据当前租户 ID (tenantId) 进行修改,以实现数据隔离。这个实现包括了从 @Repository 注解的 Mapper 接口中获取 tenantId 参数的逻辑。

拦截器实现 (TableTenantSuffixInterceptor.java)

package com.example;import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Pattern;@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class TableTenantSuffixInterceptor implements Interceptor {private Set<String> tableNameSet = new HashSet<>();@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();BoundSql boundSql = statementHandler.getBoundSql();String originalSql = boundSql.getSql();MetaObject metaObject = SystemMetaObject.forObject(statementHandler);Object parameterObject = boundSql.getParameterObject();String tenantId = getTenantId(parameterObject);if (tenantId != null && !tenantId.isEmpty()) {for (String tableName : tableNameSet) {if (originalSql.toUpperCase().contains(tableName.toUpperCase())) {String newTableName = tableName + "_" + tenantId;String newSql = originalSql.replaceAll(Pattern.quote(tableName), newTableName);metaObject.setValue("delegate.boundSql.sql", newSql);break; // Assume only one table name per SQL}}}return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {String tablesByTenant = properties.getProperty("tablesByTenant");if (tablesByTenant != null) {for (String table : tablesByTenant.split(",")) {tableNameSet.add(table.trim());}}}private String getTenantId(Object parameterObject) {if (parameterObject instanceof Map) {Map<?, ?> paramMap = (Map<?, ?>) parameterObject;return (String) paramMap.get("tenantId");} else {MetaObject metaObject = SystemMetaObject.forObject(parameterObject);if (metaObject.hasGetter("tenantId")) {return (String) metaObject.getValue("tenantId");}}return null;}
}

MyBatis 配置文件 (mybatis-config.xml)

在 MyBatis 的配置文件中,注册拦截器并指定需要根据租户 ID 分表的表名。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><plugins><plugin interceptor="com.example.TableTenantSuffixInterceptor"><property name="tablesByTenant" value="ALARM_RECORD_INFO,ALARM_TASK_INFO"/></plugin></plugins><!-- 其他配置,例如 environments, mappers 等 -->
</configuration>

Mapper 接口示例 (AlarmRecordMapper.java)

package com.example;import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;@Repository
public interface AlarmRecordMapper {List<AlarmRecordEntity> getAlarmRecordByTaskIds(@Param("tenantId") String tenantId, @Param("taskIds") Set<Integer> taskIds);
}

AlarmRecordMapper.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.AlarmRecordMapper"><select id="getAlarmRecordByTaskIds" resultType="com.example.AlarmRecordEntity">SELECT * FROM ALARM_RECORD_INFOWHERE task_id IN<foreach item="taskId" collection="taskIds" open="(" separator="," close=")">#{taskId}</foreach>AND tenant_id = #{tenantId}</select></mapper>

这个实现中,拦截器 TableTenantSuffixInterceptor 会检查每个执行的 SQL 语句,看它是否包含配置中指定的表名。如果是,它会将表名修改为包含租户 ID 后缀的形式。这个过程依赖于在 SQL 语句中直接使用表名,且假设每个 SQL 语句只涉及一个需要进行租户 ID 后缀处理的表。如果 SQL 语句中包含多个需要处理的表名,或者表名的使用方式更加复杂(例如,动态表名或 SQL 函数中使用表名),则可能需要更复杂的逻辑来正确地替换表名。

http://www.mnyf.cn/news/47358.html

相关文章:

  • 上海做网站高端爱战网关键词工具
  • 企业网站制作深圳网站推广包括
  • 哪个新闻网站做的好软文新闻发稿平台
  • 网站没权重百度下载并安装
  • 网站设计的图片移动广告平台
  • 扬中网站建设好么网络推广引流
  • 北京seo网站推广北京百度网讯人工客服电话
  • 如何优化wordpress百度关键词优化软件如何
  • 深圳网站设计比较好的公司有哪些关键词优化公司排名榜
  • 网站开发有什么技术要求百度搜图片功能
  • 关于网站建设的指标百度一键优化
  • 日本乐天购物网站网站排名优化系统
  • 网站搭建与服务器配置公司做网络推广怎么做
  • 公司网站设计软文营销实施背景
  • 企业网站打不开什么原因东莞网站营销推广
  • kangle搭建wordpressseo类目链接优化
  • discuz最新模板北京百度seo公司
  • 做网站中的镜像是什么如何做网络营销?
  • 常州做网站的网站秒收录
  • 广西住房和建设厅网站拓客app下载
  • 普通网站加css3惠州百度seo哪家好
  • 网站制作找哪家公司好网站如何提交百度收录
  • wordpress 问答类主题上海网站排名优化公司
  • 做外贸的物流网站有哪些新网站怎么推广
  • 建设银行理财网站黑帽seo排名
  • 百度搜索收录提交入口宁波品牌网站推广优化公司
  • 做网站还是租用服务器优秀网站网页设计分析
  • 0基础多久学会网站架构代运营一个月多少钱
  • 网站备案规定镇江seo
  • wordpress制作首页seo排名关键词点击