SpringBoot框架,不同环境中实体类对应不同的表

发布于:2025-07-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、背景

        因项目要求,用户方的操作系统是麒麟系统,数据库是人大金仓;开发环境是Windows系统,但是有的开发机装不上人大金仓,只好用MySQL代替。这就出现了一个问题,人大金仓建的数据库,下一级不是数据表,而是模式,写查询语句引用表时就跟MySQL不同。

        项目用到了MyBatisPlus,实体类加上注解“@TableName”,即可将该实体体的属性与数据表字段做映射。人大金仓的表名前要加模式名称,MySQL则没有,不能打包的时候改这个表名吧?这就要求项目运行或打包时根据当前环境(Profile)使用不同的表。

二、解决方案

        MyBatis的注解“@Table”本可以从profile的yml文本中加载指定的表名,但由于系统依赖了MyBatisPlus,导致注解“@Table”失效,而且强制使用了注解“@TableName”中的表名,于是改用MybatisPlus的拦截器实现。

1、定义表名

        根据环境将表名在application-xxx.yml中申明即可。

2、修改实体类

        删除实体类中的注解“@TableName”,框架会直接将实体类名称做为表名使用,在拦截器中拦截并修改即可。

3、定义拦截器

@Configuration
public class MybatisPlusConfig {
    @Value("${xx.xx.xx}")
    private String tableNameXX;

    @Bean
    public MybatisPlusInterceptor myBatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        {
            // 动态表名
            DynamicTableNameInnerInterceptor dynamicInterceptor = new DynamicTableNameInnerInterceptor();
            dynamicInterceptor.setTableNameHandler((sql, tableName) -> {
                // xxxx为实体类名,映射到tableNameXX
                if (tableName.equalsIgnoreCase("xxxx")) {
                    return tableNameXX;
                }
                return tableName;
            });
            interceptor.addInnerInterceptor(dynamicInterceptor);
        }
        return interceptor;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到