在使用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语句
但是要注意!这种情况只适用于静态的切换数据源,因为这个databaseId是sqlSessionFactory的一个属性,所以在运行过程中动态地更换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,从而选择不同的语句进行执行。虽然是笨办法,但容易理解使用
本文介绍了在SpringBoot中使用MyBatis时如何通过DatabaseIdProvider动态识别数据库连接,实现MySQL、PostgreSQL与Oracle之间的切换。通过在@Configuration类中配置DatabaseIdProvider Bean,然后在Mapper接口中根据databaseId编写不同数据库的SQL语句。然而,这种方法不适用于运行时动态更换数据源,此时推荐使用if标签结合传入的数据库类型或URL进行SQL选择。

1228

被折叠的 条评论
为什么被折叠?



