spring+mybatis配置根据连接不同的数据库执行不同的sql

spring+mybatis配置根据连接不同的数据库执行不同的sql

背景

spring项目,第一版使用sql server数据库,第二版要加入mysql数据库,但是部署文件相同,不做大修改。

实现

首先加入mysql数据库的配置

  • pom添加mysql的连接包
<dependency>
  	<groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>
  • properties加入mysql连接配置
#allowMultiQueries=true开启多条insert
#serverTimezone=Asia/Shanghai设置时区,国内可选上海和香港
jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://url:ip/dbname?allowMultiQueries=true&serverTimezone=Asia/Shanghai
jdbc.username=username
jdbc.password=password
  • spring配置bean
<bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
	<property name="properties">
		<props>
			<prop key="Microsoft SQL Server">sqlserver</prop>
			<prop key="MySQL">mysql</prop>
		</props>
	</property>
</bean>

<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
	<property name="properties" ref="vendorProperties" />
</bean>
	
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="databaseIdProvider" ref="databaseIdProvider" />
	<property name="mapperLocations" value="classpath*:/mappings/**/*.xml"/>
	<property name="configLocation" value="classpath:/mybatis-config.xml"/>
</bean>
  • 上图中vendorProperties中的key值是固定的,源码给出的解释如下
    MySQL
public String getDatabaseProductName() throws SQLException {
    try {
        return "MySQL";
    } catch (CJException var2) {
        throw SQLExceptionsMapping.translateException(var2, this.getExceptionInterceptor());
    }
}

Microsoft SQL Server

public String getDatabaseProductName() throws SQLServerException {
    this.checkClosed();
    return "Microsoft SQL Server";
}

SQLite

public String getDatabaseProductName() {
    return "SQLite";
}
  • 还剩最后一步,在mapper中配置映射关系
    加入databaseId,匹配该sql需要使用的数据库类型
<select id="selectRegion" resultType="hashmap" databaseId="sqlserver">
		select getdate()
</select>

<select id="selectRegion" resultType="hashmap" databaseId="mysql">
		select now()
</select>

根据实际情况,切换数据库

你可能感兴趣的:(数据库)