SpringBoot框架,不同环境中实体类对应不同的表
一、背景
因项目要求,用户方的操作系统是麒麟系统,数据库是人大金仓;开发环境是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;@Beanpublic MybatisPlusInterceptor myBatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();{// 动态表名DynamicTableNameInnerInterceptor dynamicInterceptor = new DynamicTableNameInnerInterceptor();dynamicInterceptor.setTableNameHandler((sql, tableName) -> {// xxxx为实体类名,映射到tableNameXXif (tableName.equalsIgnoreCase("xxxx")) {return tableNameXX;}return tableName;});interceptor.addInnerInterceptor(dynamicInterceptor);}return interceptor;}
}