SpringBoot中如何配置MyBatis动态识别数据库连接(DatabaseIdProvider的简单使用方式)

本文介绍了在SpringBoot中使用MyBatis时如何通过DatabaseIdProvider动态识别数据库连接,实现MySQL、PostgreSQL与Oracle之间的切换。通过在@Configuration类中配置DatabaseIdProvider Bean,然后在Mapper接口中根据databaseId编写不同数据库的SQL语句。然而,这种方法不适用于运行时动态更换数据源,此时推荐使用if标签结合传入的数据库类型或URL进行SQL选择。

在使用mybatis过程,如果有这样的需求:动态切换数据库,如在MySQL、PostgreSQL与Oracle之间进行切换,并使用同一个Dao接口。如何进行同一个函数调用mapper中不同的sql语句
答案就是使用 DatabaseIdProvider 进行配置
步骤一:
在@Configuration标注的类中增加一个Bean:DatabaseIdProvider

@Bean
public DatabaseIdProvider getDatabaseIdProvider() {
    DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
    Properties p = new Properties();
    p.setProperty("PostgreSQL", "postgresql");
    p.setProperty("MySQL", "mysql");
    databaseIdProvider.setProperties(p);
    return databaseIdProvider;
}

步骤二:在Mapper中用以下方法写SQL语句

<select id="queryAllTablesFromDataBase" resultType="map" databaseId="mysql">
    show tables;
</select>

<select id="queryAllTablesFromDataBase" resultType="map" databaseId="postgresql">
    SELECT tablename FROM pg_tables
    WHERE tablename NOT LIKE 'pg%'
    AND tablename NOT LIKE 'sql_%'
</select>

最重要的就是这个databaseId,它区分了不同的数据库
这样在调用这个queryAllTablesFromDataBase的时候就会去找当前连接的数据库对应的sql语句

但是要注意!这种情况只适用于静态的切换数据源,因为这个databaseIdsqlSessionFactory的一个属性,所以在运行过程中动态地更换datasource来达到切换数据源的效果,那么这种方法是无效的。
那么比较好的方法是在mybatis的语句中使用if标签,并配合传入数据库类型或者是url进行判断哪种数据库。比如以下写法

 <select id="queryAllTablesFromDataBase" resultType="map">
        <if test="url.indexOf('mysql') >= 0" >
            select table_name from information_schema.tables where table_schema='${dataBaseName}';
        </if>
        <if test="url.indexOf('postgresql') >= 0" >
            SELECT tablename FROM pg_tables
            WHERE tablename NOT LIKE 'pg%'
            AND tablename NOT LIKE 'sql_%'
        </if>
</select>

判断传入的url中是否包含mysql或是postgresql,从而选择不同的语句进行执行。虽然是笨办法,但容易理解使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值