mybatis之DatabaseIdProvider
应用中可能同时涉及到多个数据库,比如MySQL,oracle等等,那么当我们使用mybatis的时候,怎么做到动态切换呢?DatabaseIdProvider
可以帮助我们
public interface DatabaseIdProvider {
default void setProperties(Properties p) {
}
String getDatabaseId(DataSource var1) throws SQLException;
}
mybatis内置了一个实现 VendorDatabaseIdProvider
(Vendor:产商),通过数据库产品名称来识别不同的数据库
当然我们也可以按照自己定义的识别不同的数据库规则来实现DatabaseIdProvider
,然后注册到 typeAliasRegistry
中。
spring中使用
mybatis-config配置
<!-- 配置 environments -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据源具体配置省略 -->
</dataSource>
</environment>
</environments>
<!-- 配置 DatabaseIdProvider,如果是自定义规则,那么type便是你注册的别名 -->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
mapper文件
<!-- UserMapper.xml 示例 -->
<mapper namespace="com.example.mapping.UserMapper">
<select id="selectAllUsers" resultType="User">
SELECT * FROM users
</select>
<!-- 仅针对 MySQL 数据库的 SQL -->
<select id="selectWithMySQLFeature" databaseId="mysql" resultType="User">
SELECT * FROM users WHERE last_update > NOW()
</select>
<!-- 仅针对 Oracle 数据库的 SQL -->
<select id="selectWithOracleFeature" databaseId="oracle" resultType="User">
SELECT * FROM users WHERE last_update > SYSDATE
</select>
</mapper>
springboot中使用
数据源配置
@Configuration
public class DataSourceConfig {
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "oracleDataSource")
@ConfigurationProperties(prefix = "spring.datasource.oracle")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
.........
}
MyBatis配置
@Configuration
public class MyBatisConfig {
@Bean
public DatabaseIdProvider databaseIdProvider() {
// 这里使用 DB_VENDOR 类型的 DatabaseIdProvider,它基于数据库产品的名称来识别
//也可以使用自己实现的DatabaseIdProvider
return new VendorDatabaseIdProvider();
}
// 配置 MyBatis 的环境和数据源
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource mysqlDataSource,
DataSource oracleDataSource,
DatabaseIdProvider databaseIdProvider) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
// 设置主数据源
factory.setDataSource(mysqlDataSource);
// 配置 DatabaseIdProvider
Properties props = new Properties();
props.setProperty("MySQL", "mysql");
props.setProperty("Oracle", "oracle");
databaseIdProvider.setProperties(props);
factory.setDatabaseIdProvider(databaseIdProvider);
// 其他配置,如添加mapper位置等
// factory.setMapperLocations(...);
return factory.getObject();
}
}
然后通过AOP或者ThreadLocal等方式进行数据源识别,比如在mapper上添加注解。当然粒度可以自己选择是类级别还是方法级别
@DS("mysql")
public interface SecondarMapper {
// ...
}