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

怎么自己做网站教程全国职业生涯规划大赛

怎么自己做网站教程,全国职业生涯规划大赛,郑州seo关键词推广,非洲购物网站排名需求描述#xff1a; 在一个多租户系统中#xff0c;通过 MyBatis 实现动态数据表分离。具体来说#xff0c;您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样#xff0c;每个租户的数据就可以存储在专属于它们的表中#xf…需求描述 在一个多租户系统中通过 MyBatis 实现动态数据表分离。具体来说您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样每个租户的数据就可以存储在专属于它们的表中实现数据隔离。 需求细节 拦截 SQL 语句使用 MyBatis 的 Intercepts 注解和 Interceptor 接口来拦截 SQL 语句。 修改表名在 SQL 执行时根据提供的租户 ID (tenantId) 动态地修改 SQL 语句中的表名。例如如果原表名为 ALARM_RECORD_INFO租户 ID 为 1001则修改后的表名应为 ALARM_RECORD_INFO_1001。 获取租户 ID从 MyBatis Mapper 接口方法的参数中获取 tenantId。这是通过在 Mapper 接口的方法参数上使用 Param(tenantId) 注解实现的。 配置在 mybatis-config.xml 文件中配置拦截器并指定需要根据租户 ID 分表的表名。 映射器文件 (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 SetString 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 version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configurationpluginsplugin interceptorcom.example.TableTenantSuffixInterceptorproperty nametablesByTenant valueALARM_RECORD_INFO,ALARM_TASK_INFO//plugin/plugins!-- 其他配置例如 environments, mappers 等 -- /configurationMapper 接口示例 (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 {ListAlarmRecordEntity getAlarmRecordByTaskIds(Param(tenantId) String tenantId, Param(taskIds) SetInteger taskIds); }AlarmRecordMapper.xml  ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.AlarmRecordMapperselect idgetAlarmRecordByTaskIds resultTypecom.example.AlarmRecordEntitySELECT * FROM ALARM_RECORD_INFOWHERE task_id INforeach itemtaskId collectiontaskIds open( separator, close)#{taskId}/foreachAND tenant_id #{tenantId}/select/mapper这个实现中拦截器 TableTenantSuffixInterceptor 会检查每个执行的 SQL 语句看它是否包含配置中指定的表名。如果是它会将表名修改为包含租户 ID 后缀的形式。这个过程依赖于在 SQL 语句中直接使用表名且假设每个 SQL 语句只涉及一个需要进行租户 ID 后缀处理的表。如果 SQL 语句中包含多个需要处理的表名或者表名的使用方式更加复杂例如动态表名或 SQL 函数中使用表名则可能需要更复杂的逻辑来正确地替换表名。
http://www.pierceye.com/news/420/

相关文章:

  • 做家具有那个网站好51wordpress
  • 网站程序源码网页设计导航栏素材
  • 免费建设微网站制作网站维护公司推荐
  • 怎么买做淘宝优惠券网站上海网站建设公司指南
  • 公共部门网站建设维护游戏音效设计师培训
  • 首钢水钢赛德建设有限公司网站做运营常用的网站
  • 网站改名 备案免费空间是什么意思
  • 内部网站可以做ipc备案seo流量排名软件
  • 免费做的网站怎么设置域名海外互联网推广平台
  • 鄂州网站建设推广报价wordpress 定时计划失败
  • 做金融看哪些网站有哪些内容北京上海网站建设公司哪家好
  • 做司法考试题目的网站牛商网招聘
  • 网站后台管理系统怎么上传网站建设微企
  • 安阳手机网站制作兰州网站制作公司
  • 用python做 网站论坛网站做关键词
  • 南宁网站定制把网站做进微信公众号
  • 网站开发运行环境有哪些做家具有那个网站
  • 小说网站设计模板杭州全案设计公司
  • 电子商务网站 费用江油市建设局网站
  • app免费制作网站自己做网站去哪买服务器
  • 绵阳 网站开发 公司石家庄知名网站
  • div做网站排版在南昌市做网站到哪
  • 云一网站设计王野天和葛优
  • 网站首页改版影响优化天津建设工程信息网报名
  • 网站开发团队简介腾讯云域名优惠
  • 精品课程网站建设开题报告在线制作头像模板
  • 哪种网站开发简单如何申请域名后缀
  • 凡科建设网站还用买服务器吗跑步机 东莞网站建设
  • 设计之路 网站artisteer 做的网站
  • 网站设计论文框架动画设计专业大学排名国内