Mybatis创建表,动态表名

文章描述了一个使用SQL在Oracle数据库中创建表结构,包括字段定义、压缩选项、索引创建的过程,以及Java方法中对这些操作的参数化调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

展示

sql
<update id="creatPositionTable" parameterType="java.lang.String">
        CREATE TABLE ${tableName} (
          "id" VARCHAR2(120) NOT NULL,
          "code" VARCHAR2(120),
          "date" VARCHAR2(120),
          "principal_code" VARCHAR2(120),
          "principal_name" VARCHAR2(120),
          "manager_code" VARCHAR2(120),
          "manager_name" VARCHAR2(120),
          "country_code" VARCHAR2(120),
          "country_name" VARCHAR2(120),
          "province_code" VARCHAR2(120),
          "province_name" VARCHAR2(120),
          "is_valid" CHAR(1),
          "creat_time" TIMESTAMP(6)
        ) COMPRESS FOR ARCHIVE REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;
        COMMENT ON TABLE ${tableName} IS 'XX数据表';
        CREATE INDEX ${codeIndexName} on ${tableName} (
         "code"
        ) GLOBAL ;

        CREATE INDEX ${dateIndexName} on ${tableName} (
         "date"
        ) GLOBAL ;

        CREATE INDEX ${isValidIndexName} on ${tableName} (
         "is_valid"
        ) GLOBAL;
    </update>
mapper
/**
 * 
 * @param tableName 表名
 * @param batchCodeIndexName 索引名称
 * @param bizDateIndexName  索引名称
 * @param isValidIndexName  索引名称
 */
void creatPositionTable(@Param("tableName") String tableName, @Param("codeIndexName") String codeIndexName,
                        @Param("dateIndexName") String dateIndexName, @Param("isValidIndexName") String isValidIndexName);

### 使用 MyBatis 拦截器实现动态表功能 为了实现在多租户环境中根据 `tenantId` 动态更改的需求,可以利用 MyBatis 的拦截器机制来修改 SQL 语中的。下面是一个完整的解决方案。 #### 创建自定义拦截器类 创建一个新的 Java 类继承于 `Interceptor` 接口并重写其方法: ```java import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import java.sql.Connection; @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) }) public class TenantTableInterceptor implements Interceptor { private static final String TENANT_ID_KEY = "TENANT_ID"; @Override public Object intercept(Invocation invocation) throws Throwable { // 获取原始SQL语 StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement"); BoundSql boundSql = statementHandler.getBoundSql(); // 修改SQL语中的为带有租户ID前缀的形式 String originalSql = boundSql.getSql(); String tenantId = getTenantIdFromContext(); // 假设这里是从上下文中获取到的租户ID if(tenantId != null && !"".equals(tenantId.trim())) { String newSql = replaceTableNameWithTenantPrefix(originalSql, tenantId); metaObject.setValue("delegate.boundSql.sql", newSql); } return invocation.proceed(); } /** * 替换原SQL中的为带租户前缀的新称 */ private String replaceTableNameWithTenantPrefix(String sql, String tenantId){ StringBuilder resultBuilder = new StringBuilder(sql.length()); int index = 0; while(index < sql.length()){ char c = sql.charAt(index++); if(c == '`' || c=='['){ // 处理反引号或方括号包围的情况 int endIndex = sql.indexOf(']',index)>-1 ? sql.indexOf(']',index):sql.indexOf('`',index); if(endIndex>-1){ String tableName = sql.substring(index,endIndex).trim(); // 添加租户前缀 resultBuilder.append("`").append(tenantId.toLowerCase()).append("_").append(tableName).append("`"); index=endIndex+1; continue; } } resultBuilder.append(c); } return resultBuilder.toString(); } /** * 从线程局部变量或其他地方取得当前请求对应的租户ID */ protected abstract String getTenantIdFromContext(); } ``` 此代码片段展示了如何编写一个简单的 MyBatis 插件用于替换查询中的[^1]。注意这里的 `getTenantIdFromContext()` 方法需要依据实际应用场景自行实现逻辑以获得当前操作所属的租户标识。 #### 注册插件配置 为了让上述拦截器生效,在 Spring Boot 应用程序中注册该插件即可: ```yaml mybatis: configuration: plugins: - com.example.TenantTableInterceptor # 替换成真实的包路径加类 ``` 或者也可以通过编程方式添加至 MyBatis 配置对象内: ```java @Configuration public class MyBatisConfig { @Bean public ConfigurationCustomizer myBatisConfigurationCustomizer() { return configuration -> { configuration.addInterceptor(new TenantTableInterceptor()); }; } } ``` 以上就是基于 MyBatis 拦截器技术实现动态调整的一个实例教程以及最佳实践议[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值