(实测有效)分别基于Spring(SpringMVC)中的XML和SpringBoot的Bean注解形式配置MyBatis中的databaseIdProvider多数据源支持

前言

现有的软件开发中所涉及的数据库相关逻辑,基本都是使用一个数据库贯穿从开发到生产上线的所有流程,如果在如开发使用mysql,上线由于数据量较大,需要更换为Oracle数据库这种业务需求较为特殊的前提下,可能一个数据库来开发就并不适用。如果在你的项目中有用到Mybatis这个ORM框架(主要是其他的框架还没有这样去用过 -_-!),那就舒服了,因此他可以解决这类特殊的场景需求,那就是今天的主角-databaseIdProvider属性。

准备

既然需要对它进行各种配置以达到项目中可以切换不同数据库的业务需求,则必然应该引入对应的依赖,当然我这里仅考虑用Java语言的Maven项目为基础进行操作,其他的项目请各位自行调整。

此处选用的两种不同的数据库分别是MySQL和Oracle(ps:其他的数据库就引入相应的依赖包即可),无论是SpringBoot项目还是Spring(SpringMVC)项目,都需要配置POM文件;具体的测试过程我就不贴出来了,你们也用不上,将必须的配置挪出来即可。

  1. 引入Maven项目的Pom依赖
    由于仅为测试,基本不涉及业务逻辑代码,因此该POM文件中只有基础的依赖和数据库相关驱动。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mybatis.databaseId</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
   		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--MySQL 驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--Oracle 驱动包-->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

SpringBoot中使用databaseIdProvider多数据源

  1. 在application.properties配置以下数据.
#服务端口
server.port=8081  

#MySQL数据库支持
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/work?useTimezone=true&serverTimezone=GMT%2B8
#spring.datasource.username=数据库用户名
#spring.datasource.password=数据库密码

#Oracle数据库支持
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@192.168.140.131:1521:orcl
spring.datasource.username=数据库用户名
spring.datasource.password=数据库密码

#配置Bean的别名和配置xxxMapper.xml文件的文件路径
mybatis.typeAliasesPackage=com.mybatis.databaseid.beans  
mybatis.mapper-locations=classpath*:mybatis/*.xml

#指定多数据源的统一名称,没用到.
#mybatis.configuration.database-id=DB_VENDOR

2.通过@Bean注解注入一个VendorDatabaseIdProvider类的对象至Spring容器中,代码如下:

@Configuration
public class DatabaseConfig{

    @Bean
    public DatabaseIdProvider getDatabaseIdProvider (){
        DatabaseIdProvider dbProvider =new VendorDatabaseIdProvider();
        Properties setPro =new Properties();
        //此处可以添加其他的数据库型号.如MySQL这类厂商标识一定不要写错!!
       setPro .setProperty("MySQL","mysql");  //MySQL必须这样写,但是mysql可以随意写,后面代码同此处.
       setPro .setProperty("Oracle","oracle");
        dbProvider .setProperties(setPro);
        return  dbProvider ;
    }
}

如果你不知道其他的数据库厂商,可以参考下面这篇文章,获取对应的数据库厂商标识:
转载来源: jdbc判断不同的数据库厂商.
————————————————

3.在xxxmapper.xml文件的select、insert、update标签内添加databaseId属性,并赋予它在Bean中你随意写的值,如我写的是mysql,则在xml文件中就应该写成databaseId=“mysql”,示例如下:

<!--该代码仅作说明, 不要拷贝,请根据自己的业务需求修改.!!-->
<select id="selectBySnum" databaseId="mysql" resultType="com.mybatis.databaseid.beans.Student">
        select * from student where snum =#{snum}
</select>

<select id="selectBySnum" databaseId="oracle" resultType="com.mybatis.databaseid.beans.Student">
        select * from student where snum =#{snum}
</select>

如果你的项目中并没有使用xxxxmapper.xml来配置接口和语句的绑定关系,而使用注解形式的@Insert\Select\Update来动态绑定,则需要在上述注解再添加databaseId="mysql"来进行SQL语句的数据库识别;千万不要在@Options(databaseId=“mysql”)中使用它,因此这个注解不起任何作用,个人猜测应该是官方还没有升级,@Options注解中的databaseId是保留但未使用的。
代码示例如下:

<!--该代码仅作说明, 不要拷贝,请根据自己的业务需求修改.!!-->
 @Select(value = "select * from student where snum =#{snum}",databaseId = "mysql")
  // @Options(databaseId = "mysql") //千万不要用这个注解对应的databaseId,因为是不起作用的.
 public Student selectBySnum(Integer snum);
 

至此在SpringBoot中配置多数据源就已经结束,在SpringBoot项目运行后会发现项目可以基于不同的配置来使用XML文件中的语句读取不同的数据库。这里需要强调的重点就是数据库厂商标识千万千万不要写错,它是严格区分大小写的!陋猪就是这里栽了…

Spring(SpringMVC)中使用databaseIdProvider多数据源

众所周知,在Spring(SpringMVC)中多数配置都是采用的XML文件配置形式。在Spring(SpringMVC)中配置Mybatis必不可少的两个文件为:mybatis-config.xml和一系列的XXXMapper.xml文件,因此它同SpringBoot项目中的配置不太一样,具体配置如下:

  1. mybatis-config.xml配置(可以不叫这个,但是他是整体配置整个Mybatis的属性的),具体配置如下 .
<configuration>
	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/work?useTimezone=true&serverTimezone=GMT%2B8" />
				<property name="username" value="数据库用户名" />
				<property name="password" value="数据库密码" />
			</dataSource>
		</environment>
		<environment id="oracle">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
				<property name="url" value="jdbc:oracle:thin:@192.168.140.131:1521:orcl" />
				<property name="username" value="数据库用户名" />
				<property name="password" value="数据库密码" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 
		5.databaseIdProvider:
			Mybatis用来支持多数据库厂商。Mybatis可以根据不同的数据库执行不同的sql语句
			DB_VENDOR: VendorDatabaseIdProvider 作用就是得到数据库厂商的标识名.
					   Connection.getMetaData().getDataBaseProductName();	
			常见的数据库厂商的标识名:
				MySQL:  MySQL
				Oracle: Oracle
				SQL Server:  SQL Server		
	 --> 
	 <databaseIdProvider type="DB_VENDOR">
	 	<!-- 为数据库厂商的标识名起别名 -->
	 	<property name="MySQL" value="mysql"/>
	 	<property name="Oracle" value="oracle"/>
	 	<property name="SQL Server" value="sqlserver"/>
	 </databaseIdProvider>
</configuration>

其中的databaseIdProvider标签中所携带的type=DB_VENDOR属性是默认且唯一的,在Mybatis源码的Configuration类中可以看到DB_VENDOR就指代的是VendorDatabaseIdProvider类,不过用户是可以自定义Provider类的,只需要实现DatabaseIdProvider这个接口再加上type=实现的类即可。

上面的environment标签就是下面databaseIdProvider ->property标签中属的value属性值,不同environment对应不同的数据源,可以根据这个去切换。

同样的如果你不知道其他的数据库厂商,可以参考下面这篇文章,获取对应的数据库厂商标识:
转载来源: jdbc判断不同的数据库厂商.
————————————————

2.同SpringBoot一致,在xxxmapper.xml文件的select、insert、update标签内添加databaseId属性,并赋予它在Bean中你随意写的值,如我写的是mysql,则在xml文件中就应该写成databaseId=“mysql”,示例如下:

<!--该代码仅作说明, 不要拷贝,请根据自己的业务需求修改.!!-->
<select id="selectBySnum" databaseId="mysql" resultType="com.mybatis.databaseid.beans.Student">
        select * from student where snum =#{snum}
</select>

<select id="selectBySnum" databaseId="oracle" resultType="com.mybatis.databaseid.beans.Student">
        select * from student where snum =#{snum}
</select>

至此在Spring(SpringMVC)中配置多数据源就已经结束。重要的事情多强调几次,这里需要强调的重点就是数据库厂商标识千万千万不要写错,它是严格区分大小写的!

结束语

没有结束语,因此生命不息,学习不止!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值