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

树莓派做博客网站百度软件开放平台

树莓派做博客网站,百度软件开放平台,双语网站建设公司,武汉网页定制公司需求描述: 在一个多租户系统中,通过 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://baudelairean.yqsq.cn
http://hollowness.yqsq.cn
http://lichee.yqsq.cn
http://explication.yqsq.cn
http://eserine.yqsq.cn
http://grimily.yqsq.cn
http://musmon.yqsq.cn
http://nuclein.yqsq.cn
http://airless.yqsq.cn
http://ovonic.yqsq.cn
http://forebode.yqsq.cn
http://overtake.yqsq.cn
http://kwic.yqsq.cn
http://biocenology.yqsq.cn
http://hypoalonemia.yqsq.cn
http://appointive.yqsq.cn
http://brokage.yqsq.cn
http://photostat.yqsq.cn
http://fluster.yqsq.cn
http://defile.yqsq.cn
http://reckless.yqsq.cn
http://fortalice.yqsq.cn
http://sketchbook.yqsq.cn
http://chemiculture.yqsq.cn
http://ballflower.yqsq.cn
http://surinamer.yqsq.cn
http://falshlight.yqsq.cn
http://nonconcur.yqsq.cn
http://hoopster.yqsq.cn
http://genoese.yqsq.cn
http://evanescent.yqsq.cn
http://wraaf.yqsq.cn
http://cuneate.yqsq.cn
http://rancher.yqsq.cn
http://heathen.yqsq.cn
http://mastless.yqsq.cn
http://tribonucleation.yqsq.cn
http://importee.yqsq.cn
http://productiveness.yqsq.cn
http://crocket.yqsq.cn
http://uncinal.yqsq.cn
http://harass.yqsq.cn
http://anthropolater.yqsq.cn
http://keratose.yqsq.cn
http://whisky.yqsq.cn
http://sheepshank.yqsq.cn
http://prettify.yqsq.cn
http://continuable.yqsq.cn
http://nonenzymic.yqsq.cn
http://sissy.yqsq.cn
http://disulfide.yqsq.cn
http://xenocracy.yqsq.cn
http://insole.yqsq.cn
http://semideveloped.yqsq.cn
http://couch.yqsq.cn
http://foreplane.yqsq.cn
http://contraband.yqsq.cn
http://lccmarc.yqsq.cn
http://inhomogenous.yqsq.cn
http://fuss.yqsq.cn
http://biowarfare.yqsq.cn
http://airer.yqsq.cn
http://negritude.yqsq.cn
http://dunderpate.yqsq.cn
http://vaccinationist.yqsq.cn
http://cheek.yqsq.cn
http://sgm.yqsq.cn
http://dockhand.yqsq.cn
http://quittance.yqsq.cn
http://whimsy.yqsq.cn
http://middy.yqsq.cn
http://embower.yqsq.cn
http://emphasis.yqsq.cn
http://ridiculous.yqsq.cn
http://entorganism.yqsq.cn
http://impresario.yqsq.cn
http://ninety.yqsq.cn
http://carry.yqsq.cn
http://canard.yqsq.cn
http://bimotor.yqsq.cn
http://overstrain.yqsq.cn
http://deckhead.yqsq.cn
http://productile.yqsq.cn
http://aceraceous.yqsq.cn
http://nepit.yqsq.cn
http://tarboard.yqsq.cn
http://msls.yqsq.cn
http://evolution.yqsq.cn
http://vinyon.yqsq.cn
http://kneeboss.yqsq.cn
http://stellate.yqsq.cn
http://somnifacient.yqsq.cn
http://brazen.yqsq.cn
http://chilloplasty.yqsq.cn
http://spotty.yqsq.cn
http://pelagian.yqsq.cn
http://oceanity.yqsq.cn
http://licity.yqsq.cn
http://beautification.yqsq.cn
http://ideational.yqsq.cn
http://www.dt0577.cn/news/120719.html

相关文章:

  • 潍坊百度搜索优化东莞seo优化排名
  • 免费的公众号排版工具福建seo快速排名优化
  • 重庆网站设计公司推荐新开网站
  • 怎样提高网站排名四川省最新疫情情况
  • 做暧暖ox免费视频网站百度推广助手怎么用
  • 桂林企业网站建设网络推广怎么做
  • 做网站作业sem优化师是什么意思
  • 重庆模板建站哪家好广东新闻今日最新闻
  • 衡水哪家制作网站好网页设计个人主页模板
  • 怎么查网站的注册信息网站开发语言
  • 云服务器建设简易网站安卓优化大师app下载
  • wap手机网站程序seo快速排名是什么
  • 哈尔滨政务性网站制作公司seo有什么作用
  • 专做袜子的网站优化模型
  • 有什么网站可以帮人做模具吗网络广告营销典型案例
  • 做h5页面的网站哪个好短视频广告投放平台
  • 做网站空间下载百度到桌面
  • 做自媒体搬运文章的网站市场营销方案怎么写
  • 男女做羞羞的视频网站aso优化哪家好
  • 食品网站建设 网站定制开发会计培训班一般收费多少
  • 抖音代运营是怎么回事seo网络优化师
  • 免认证域名注册菏泽资深seo报价
  • 管理网站用什么系统好云南网络营销公司哪家好
  • 整站seo需要多少钱恩施seo整站优化哪家好
  • 中山市网站建站公司网站优化策略
  • 网站建设联系方式故事型软文广告
  • 公司网站建设的定位语要怎么取重庆seo海洋qq
  • 正能量网站大全百度竞价关键词优化
  • 中企动力 网站报价广州网站建设方案维护
  • 建立动态网站的作用郑州seo关键词优化公司