概述
配置多數據源有兩種方案。一種是使用dynamic依賴的@DS注解的方法,這種是比較簡單方便的方法。另一種是本文介紹的方式,配置不同數據源的SqlSessionFactory 。
第二種方法是我在開發一個老項目時,老項目配置的方法。
application.xml
server:port: 8002spring:datasource:master:jdbc-url: xxxusername: usernamepassword: passworddriver-class-name: driver-class-nameslave:jdbc-url: xxxusername: usernamepassword: passworddriver-class-name: driver-class-name
初始化多數據源
package com.zou.myproject.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configuration
public class DatasourceConfig {@Primary@Bean("masterDatasource")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDatasource(){return DataSourceBuilder.create().build();}@Bean("slaveDatasource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDatasource(){return DataSourceBuilder.create().build();}}
主數據源配置
package com.zou.myproject.config;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.zou.myproject.mapper",sqlSessionFactoryRef = "sqlSessionFactoryMaster",sqlSessionTemplateRef = "sqlSessionTemplateMaster"
)
public class MasterDatasourceConfig {private DataSource masterDatasource;public MasterDatasourceConfig(@Qualifier("masterDatasource") DataSource masterDatasource){this.masterDatasource = masterDatasource;}@Bean("sqlSessionFactoryMaster")@Primarypublic SqlSessionFactory sqlSessionFactoryMaster() throws Exception{MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setDataSource(masterDatasource);PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml"));return bean.getObject();}@Bean("sqlSessionTemplateMaster")@Primarypublic SqlSessionTemplate sqlSessionTemplateMaster() throws Exception{return new SqlSessionTemplate(sqlSessionFactoryMaster());}
}
次數據源
package com.zou.myproject.config;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.zou.myproject.mapper2",sqlSessionFactoryRef = "sqlSessionFactorySlave",sqlSessionTemplateRef = "sqlSessionTemplateSlave"
)
public class SlaveDatasourceConfig {private DataSource slaveDatasource;public SlaveDatasourceConfig(@Qualifier("slaveDatasource") DataSource slaveDatasource){this.slaveDatasource = slaveDatasource;}@Bean("sqlSessionFactorySlave")public SqlSessionFactory sqlSessionFactorySlave() throws Exception{MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setDataSource(slaveDatasource);PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resolver.getResources("classpath*:/mapper2/*.xml"));return bean.getObject();}@Bean("sqlSessionTemplateSlave")public SqlSessionTemplate sqlSessionTemplateSlave() throws Exception{return new SqlSessionTemplate(sqlSessionFactorySlave());}
}
測試
我這里就不貼代碼了。思路就是創建單元測試,新建兩個mapper,不同mapper對應不同數據源。最后我自己的測試方法是可行的。
啟動類取消mybatisplus的自動裝配
如果上面配置完啟動后,使用mybatisplus封裝的方法報了Invalid bound statement的錯誤,就把MybatisAutoConfiguration.class從啟動類中排除掉。
package com.zou.myproject;import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
public class MyProjectApplication {public static void main(String[] args) {SpringApplication.run(MyProjectApplication.class, args);}}
總結
springboot mybatis mybatisplus+多數據源配置+事務,這塊內容開發的時候都是一直查一直試錯才找到解決方案的,有時間得看源碼才能理清楚。