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 版权协议,转载请附上原文出处链接和本声明。