完整的pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
application.properties 配置文件
server.port=9001
#datasource primary数据源1
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/ccs?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.primary.username=root
spring.datasource.primary.password=1234
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
#datasource secondary数据源2
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/ccs1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=1234
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
# mybatis扫描
mybatis.type-aliases-package=com.phan.springbootdemo.entity
# mapper.xml文件包路径,对应你自己的路径
mybatis.mapper-locations=classpath:mybatis/mapper/*/*.xml
mybatis.config-location=classpath:mybatis-config.xml
项目结构
关键就两个配置类
数据源配置类:
数据源1配置类 PrimaryDataSourceConfig
package com.phan.springbootdemo.config;
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.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@SpringBootConfiguration
@MapperScan(basePackages = "com.phan.springbootdemo.mapper.mapper1", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary") //读取配置文件中的数据源,和你自己配置的数据源前缀保持一致
@Qualifier("primaryDataSource") //指定数据源名称
@Primary //多个数据源时,一定要有一个数据源加上@Primary注解,否则启动时可能会报类似这样的异常,expected single matching bean but found 2:
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
//配置主数据源的事务
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//mybatis写配置文件(sql映射)需要加下面的代码
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mappers/mapper1/*.xml"));
return bean.getObject();
}
@Bean(name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate primarySqlSessionTemplate(
@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
数据源2配置类 SecondaryDataSourceConfig
package com.phan.springbootdemo.config;
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.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@SpringBootConfiguration
@MapperScan(basePackages = "com.phan.springbootdemo.mapper.mapper2", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary") //读取配置文件中的数据源,和你自己配置的数据源前缀保持一致
@Qualifier("secondaryDataSource") //指定数据源名称
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//mybatis写配置文件(sql映射)需要加下面的代码
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mappers/mapper2/*.xml"));
return bean.getObject();
}
@Bean(name = "secondarySqlSessionTemplate")
public SqlSessionTemplate secondarySqlSessionTemplate(
@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
测试
其它就跟普通一样了,注意不通数据源对应的mapper分开就行了,我测试直接用了一个service简单粗暴,项目中最好分开:
测试结果:数据源1的登录
数据源2的登录:
需要注意的点
1、配置数据源时,这个prefix的值一定要对应你的application.properties文件中你定义的数据源的前缀,如我的properties文件中是这样的,对应的值也是它;***@ConfigurationProperties(prefix = “spring.datasource.primary”)***
2、配置类上用了@MapperScan注解,已经标明了mapper的包路径,对应的mapper接口上就不需要再写@Mapper注解了,否则启动可能会报错