第一步:在bootstrap.yml中配置数据库类型,如:DATABASE_TYPE: mysql 。 (比变量只能配置在本地,通过解析文件获取此配置。 经过测试此配置不支持从springcloud config配置中心获取,因为接口DatabaseIdProvider的实现类是通过new的方式进行创建,而不是采用spring实例化的方式)
第二步. 在mybatise-config.xml中,添加配置项,如下:
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
</dataSource>
</environment>
</environments>
<databaseIdProvider type="com.xxx.xx.db.DataBaseIdProvider">
<property name="mysql" value="mysql"/> <!-- 标注红色部分,为mapper.xml文件 标签 databaseId的值 -->
<property name="oracle" value="oracle"/>
<property name="dm" value="dm"/>
</databaseIdProvider>
第三步:定义DataBaseIdProvider实现类
public class DataBaseIdProvider implements DatabaseIdProvider {
private Properties properties = null;
private Logger log = LoggerFactory.getLogger(DataBaseIdProvider.class);
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String getDatabaseId(DataSource dataSource) throws SQLException {
String databaseType = "mysql";
try {
Yaml yaml = new Yaml();
URL url = this.getClass().getClassLoader().getResource("bootstrap.yml");
if (url != null) {
@SuppressWarnings("unchecked")
Map<String, String> map = (Map<String, String>) yaml.load(new FileInputStream(url.getFile()));
if (null != map.get("DATABASE_TYPE")){
log.info("config database type is :" + map.get("DATABASE_TYPE"));
databaseType = map.get("DATABASE_TYPE");
}else{
log.info("default database type is :" + databaseType);
}
}
} catch (Exception e) {
log.info("read bootstrap.yml failed:" + e.getMessage());
}
return properties.getProperty(databaseType);
}
}
第四步:在mapper.xml文件中,配置databaseId
<select id="isKpiNameExist" parameterType="java.lang.String" resultType="java.lang.Integer" databaseId="mysql">
<select id="isKpiNameExist" parameterType="java.lang.String" resultType="java.lang.Integer" databaseId="oracle">
<select id="isKpiNameExist" parameterType="java.lang.String" resultType="java.lang.Integer" databaseId="dm">