@TableName("web_warn_renewal_job") 实体类动态指定表名如何实现
时间: 2025-01-18 12:08:28 浏览: 67
在Java中使用MyBatis-Plus框架时,可以通过`@TableName`注解来动态指定实体类对应的数据库表名。以下是实现实体类动态指定表名的步骤:
1. **引入依赖**:确保你的项目中已经引入了MyBatis-Plus的依赖。
2. **使用`@TableName`注解**:在实体类上使用`@TableName`注解,并指定表名。
下面是一个具体的示例:
```java
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("web_warn_renewal_job")
public class WebWarnRenewalJob {
private Long id;
private String name;
private String description;
// Getters and Setters
}
```
如果你需要动态指定表名,可以通过实现`ITableNameHandler`接口来动态设置表名:
```java
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.handlers.TableNameHandler;
import org.apache.ibatis.reflection.MetaObject;
import java.util.HashMap;
import java.util.Map;
public class DynamicTableNameHandler implements TableNameHandler {
private static final Map<String, String> TABLE_NAME_MAP = new HashMap<>();
static {
TABLE_NAME_MAP.put("defaultTable", "web_warn_renewal_job");
TABLE_NAME_MAP.put("anotherTable", "another_table_name");
}
@Override
public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
String dynamicTableName = TABLE_NAME_MAP.getOrDefault(tableName, tableName);
return dynamicTableName;
}
}
```
然后在配置类中注册这个处理器:
```java
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new DynamicTableNameInterceptor());
return interceptor;
}
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource, MybatisPlusInterceptor interceptor) {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
MybatisConfiguration configuration = new MybatisConfiguration();
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(interceptor);
return sqlSessionFactory;
}
}
```
其中`DynamicTableNameInterceptor`是自定义的拦截器:
```java
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.reflection.MetaObject;
public class DynamicTableNameInterceptor extends AbstractSqlParserHandler {
@Override
public void processTable(MetaObject metaObject, String tableName, MappedStatement mappedStatement) {
TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
if (tableInfo != null) {
String dynamicTableName = new DynamicTableNameHandler().dynamicTableName(metaObject, tableName, tableName);
tableInfo.setTableName(dynamicTableName);
}
}
}
```
通过上述步骤,你可以在实体类中动态指定表名。
阅读全文
相关推荐


















