1、说明

这里说的多种数据库连接,是指同时支持多种Sql语法,可做到不同类型数据库使用同一套后台代码而不用改动,不是多数据源。

这里有一种简单的方式可以实现,就是使用MyBatis的databaseId来实现不同数据库之间的切换。本例以SpringBoot来实现。

2、添加配置文件

新增一个配置类,把databaseIdProvider注册到Spring容器

import java.util.Properties;

import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Mybatis同时支持多种数据库配置(切换数据库需重启服务才能生效)
 *
 */
@Configuration
public class DatabaseConfig {
    
    /**
     * 自动识别使用的数据库类型
     * 
     * properties的key与数据库类型对应,为固定写法;
     * properties的value与*mapper.xml中的databaseId的值对应,可以自定义; 
     * 如果*mapper.xml中没有databaseId选择则说明该sql适用所有数据库。
     */
    @Bean
    public DatabaseIdProvider getDatabaseIdProvider() {
        Properties properties = new Properties();
        properties.setProperty("Oracle","oracle");
        properties.setProperty("MySQL","mysql");
        properties.setProperty("DB2","db2");
        properties.setProperty("Derby","derby");
        properties.setProperty("H2","h2");
        properties.setProperty("HSQL","hsql");
        properties.setProperty("Informix","informix");
        properties.setProperty("SQL Server","sqlserver");
        properties.setProperty("PostgreSQL","postgresql");
        properties.setProperty("Sybase","sybase");
        properties.setProperty("Hana","hana");
        
        DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        databaseIdProvider.setProperties(properties);
        
        return databaseIdProvider;
    }
}

3、指定数据库类型(非必须)

这一步是非必须的,MyBatis会根据配置的数据源来自动判断数据库类型,从而选择使用哪个sql语句

# ----------------MyBatis配置---------------
#mybatis.configuration.database-id=postgresql
## mybatis映射文件位置
mybatis.mapper-locations=classpath:mybatis/mapping/*/*/*.xml
## mybatis自动映射实体类别名,多个包以","分割即可,如果过长需要以"\"结尾,就可以换行写了(切记"\"后面不能跟任何字符,包括空格)
mybatis.type-aliases-package=com.qfx.modules.system.entity,com.qfx.modules.system.vo,\

4、使用

在*mapper.xml中添加databaseId,通过databaseId的值来判断执行哪条语句,例如:

<!-- 如果不指定databaseId,则默认支持所有指定类型数据库,不管当前是什么数据库都会走这个方法 -->
  <select id="sayHello" resultType="java.util.Map">
    select '我来自mysql库' as info
  </select>
  
  <!-- 如果指定databaseId,则表示此方法仅被指定的库可以使用,比如这里就仅适用于postgresql -->
  <select id="sayHello" resultType="java.util.Map" databaseId="postgresql">
    select '我来自postgresql库' as info
  </select>
  
  <!-- 如果指定databaseId,则表示此方法仅被指定的库可以使用,比如这里就仅适用于oracle -->
  <select id="sayHello" resultType="java.util.Map" databaseId="oracle">
    select '我来自postgresql库' as info
  </select>

5、测试

5.1 MySql数据库

走默认的方法(没有指定databaseId)

MyBatis支持多种数据库连接(多种sql语法支持)_MyBatis


MyBatis支持多种数据库连接(多种sql语法支持)_MyBatis_02

5.2 PostgrseSql数据库

自动匹配了databaseId="postgresql"的方法

MyBatis支持多种数据库连接(多种sql语法支持)_MyBatis_03

MyBatis支持多种数据库连接(多种sql语法支持)_MyBatis_04