mybatis 之 DatabaseIdProvider 教程

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 {
    // ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗罗的1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值