一、背景
因项目要求,用户方的操作系统是麒麟系统,数据库是人大金仓;开发环境是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;
}
}