使用mybatis的databaseId属性直接配置多数据库支持
注意事项:
1、本文针对的是多数据库切换,而非多数据源切换;
2、本文所使用的方法是在配置文件中配置好需要使用的数据库,而不是在项目运行以后随时切换,若要切换数据库,需要修改配置文件并重启项目。
大家阅读本文前请注意以上两条事项,确定本文内容是否符合你的功能要求,再决定是否继续阅读本文。
接下来进入正题,首先是数据库配置,直接按照常规的配法就可以了,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
而要想使用databaseId的话,需要增加一个bean的配置,如下:
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; @Configuration public class BeanConfig { @Bean public DatabaseIdProvider getDatabaseIdProvider() { DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); Properties p = new Properties(); p.setProperty("DM DBMS", "dm7"); p.setProperty("MySQL", "mysql"); databaseIdProvider.setProperties(p); return databaseIdProvider; } }
在这段代码中,给Properties设置了两个对象,对应着两种数据库,一个是达梦7,一个是mysql。key的值是对应的数据库的productName,value则是一个自定义的值,你可以取一个你喜欢的名字,这个名字会在mybatis的mapper里面用到。
而在这里,也要说到文章开头时说过的问题。使用databaseId来配置多数据库的方法网上很多,但是我找到的所有文章,都没有说到,这个Properties的key和value到底是什么意思,有没有什么规范。而且网上几乎都是用oracle和mysql来做例子,但没有提到其他数据库的配置方法,这就导致我们在使用类似达梦数据库的时候,完全不知道该怎么配置。后来我找了官方资料,并结合百度到的信息,得出的结论是,Properties的key就是数据库的productName。既然知道了这一点,后面就好办了,百度到了数据库获取productName的方法后,自然也就可以获取到达梦数据库的productName值了,具体方法如下:不仅仅是达梦数据库,任何数据库都是这样获取的。
import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; public class Test { public static void main(String[] args) throws Exception { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/"; String username = "root"; String password = "root"; Class.forName(driver); Connection con = (Connection) DriverManager.getConnection(url,username,password); DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData(); System.out.println("数据库的产品名称:" + metaData.getDatabaseProductName()); } }
获取到了productName,我们就可以在配置类中将我们需要的数据库配置好,然后再mapper里写sql时,加上databaseId,例如:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.freddy.mfd7.test.UserMapper"> <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="dm7"> select * from "demo"; </select> <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="mysql"> select * from demo; </select> </mapper>
mybatis在进行mapper注入时,会出现3种情况,该sql的databaseId和当前数据源的databaseId一样,该sql的databaseId和当前数据源的databaseId不一样,或者该sql没有配置databaseId。mybatis装配时,当同一方法被找到多个sql时,会优先使用databaseId相同的sql,如果没有databaseId相同的sql,再使用没有配置databaseId的sql。databaseId不对应的sql是不会使用的。