Spring4 Mybatis配置多个数据源

  • Post author:
  • Post category:其他

Spring4 Mybatis配置多个数据源

概要

在实际项目当中,会使用多个数据源,比如replication结构, 或者基表库和用户库等等。
配置多个数据源有很多方式, 在这里只记载用annotation方式的多个数据源配置方式给记录下来。
方便以后再来这边做拷贝。

配置

版本,依赖

dependencies {
    compile 'org.springframework:spring-webmvc:4.3.14.RELEASE'
    compile 'org.mybatis:mybatis-spring:1.3.1'
    compile 'org.mybatis:mybatis:3.4.5'
    compile 'org.springframework:spring-jdbc:4.3.14.RELEASE'
    compile 'org.apache.tomcat:tomcat-jdbc:9.0.4'
    compile 'mysql:mysql-connector-java:6.0.6'
    compile 'commons-dbcp:commons-dbcp:1.4'
}

spring

application-context.xml

内容看起来很长, 但是细看也没什么东西。 另外#{jdbc[‘properties.key’]} 这部分需要在util:properties标签定义的properties文件里面提前配置好。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
                            http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- property placeholder 读取数据库连接信息 -->
    <util:properties id="jdbc" location="classpath:/properties/jdbc.properties"/>

    <!-- 激活Annotation方式的transacton -->
    <tx:annotation-driven transaction-manager="masterTransactionManager"/>

    <!-- datasource共同部分 -->
    <bean id="datasource-common" abstract="true">
        <property name="driverClassName" value="#{jdbc['common.driverClassName']}" />
        <property name="maxActive" value="#{jdbc['common.maxActive']}"/>
        <property name="maxIdle" value="#{jdbc['common.maxIdle']}"/>
        <property name="maxWait" value="#{jdbc['common.maxWait']}"/>
        <property name="validationQuery" value="#{jdbc['common.validationQuery']}"/>
        <property name="testOnBorrow" value="#{jdbc['common.testOnBorrow']}"/>
        <property name="testOnReturn" value="#{jdbc['common.testOnReturn']}"/>
        <property name="testWhileIdle" value="#{jdbc['common.testWhileIdle']}"/>
    </bean>

    <!-- ▼▼▼ master area ▼▼▼ -->
    <!-- master的sessionfactory 设定 -->
    <bean id="masterSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="masterDataSource"/>
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
    </bean>

    <!-- master的Transaction设定 -->
    <bean id="masterTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="masterDataSource"/>
        <property name="globalRollbackOnParticipationFailure" value="false"/>
    </bean>

    <!--  master datasource -->
    <bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource" parent="datasource-common">
        <property name="url" value="#{jdbc['master.url']}"/>
        <property name="username" value="#{jdbc['master.userName']}"/>
        <property name="password" value="#{jdbc['master.password']}"/>
    </bean>

    <!-- datasource annotation设定 -->
    <mybatis:scan base-package="cn.group.company" 
        annotation="cn.group.company.common.annotations.MasterDB" 
        factory-ref="masterSqlSessionFactory"/>

    <!-- ▲▲▲  master area ▲▲▲ -->

    <!-- ▼▼▼  slave ▼▼▼ -->
    <!-- sessionfactory 设定 -->
    <bean id="slaveSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="slaveDataSource"/>
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
    </bean>

    <!-- Transaction设定 -->
    <bean id="slaveTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="slaveDataSource"/>
        <property name="globalRollbackOnParticipationFailure" value="false"/>
    </bean>

    <!-- annotation transaction 激活 -->
    <tx:annotation-driven transaction-manager="slaveTransactionManager"/>

    <!--  slave datasource -->
    <bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource" parent="datasource-common">
        <property name="url" value="#{jdbc['slave.url']}"/>
        <property name="username" value="#{jdbc['slave.userName']}"/>
        <property name="password" value="#{jdbc['slave.password']}"/>
    </bean>

    <!-- datasource annotation定义 -->
    <mybatis:scan base-package="cn.group.company"
        annotation="cn.group.company.common.annotations.SlaveDB" 
        factory-ref="slaveSqlSessionFactory"/>
    <!-- ▲▲▲  slave ▲▲▲ -->
</beans>

java部分

  • 2个annotation

    • MasterDB.java

      package cn.group.company.common.annotations;
      
      import java.lang.annotation.Documented;
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface MasterDB {}
    • SlaveDB.java

      package cn.group.company.common.annotations;
      
      import java.lang.annotation.Documented;
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface SlaveDB {}

    配置到这里基本差不多了。 在实际开发Mapper的时候只要加上Annotation,会根据annotation调用对应的数据源。

实际应用

  • ProductMapper.java
package cn.group.company.api.product.mapper

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import cn.group.company.api.product.domain.ProductDomain;
import cn.group.company.common.annotations.SlaveDB;

@Mapper
@SlaveDB  // 会调用slave db
public interface AdMapper {
    public List<ProductDomain> getProductInfo();
}

测试

待补充

补充

在配置过程中,在mybatis:scan标签定义的base-package里如果找不到@SlaveDB或者@MasterDB,Spring在启动的时候会报一个找不到bean的错误。所以给默认找个base-package的任意mapper上把这两个Annotation加进去,以防启动的时候报错。


版权声明:本文为kimsung原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。