SpringBoot+MyBatis配置多数据源(两种⽅式实现)在项⽬的开发中 , 有时候会涉及到多个数据库的访问 , 也就是多个数据源; 下⾯记录⼀下如何使⽤SpringBoot + MyBatis配置多数据源.
⾸先使⽤IDEA搭建⼀个SpringBoot项⽬ , 我使⽤的是JDK1.8 ,SpringBoot版本为1.5.12.RELEASE , 另外添加⼀些起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId&batis.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>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
以下是我的项⽬结构
项⽬搭建起来之后 , 在进⾏SpringBoot的配置 , 我使⽤的是properties的⽅式,⽽⾮yml;在我们本地的MYSQL上 , 我新建了两个数据库 VX 和 CRAWLER , 并配置⽂件中添加上相应的配置
springboot aop
mybatis.mapper-locations=classpath:/mapper/**/*.xml
jdbc.vx.sql.jdbc.Driver
jdbc.vx.url=jdbc:mysql://localhost:3306/vx?autoReconnect=true&useUnicode=true&characterEncoding=utf8
jdbc.vx.username=root
jdbc.vx.password=123456
jdbc.sql.jdbc.Driver
jdbc.filters=stat
jdbc.maxActive=20
jdbc.initialSize=1
jdbc.maxWait=6000
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.minEvictableIdleTimeMillis=300000
jdbc.validationQuery=select 'x' from dual
jdbc.poolPreparedStatements=true
jdbc.maxOpenPreparedStatements=20
boot.datasource.multi.dao=debug
------------------------------------------- 第⼀种⽅式 ------------------------------------------------
在config包下新建⼀个配置类 ,  相当于是spring的⼀个配置⽂件
boot.fig;
import t.annotation.Configuration;
@Configuration
public class MultiDataSourceConfig {
}
现在 , ⼀步⼀步加⼊配置 ;
1) 配置数据源
@Bean
@Primary
@ConfigurationProperties(prefix = "jdbc.vx")
public DataSource vxDataSource(){
ate().build();
}
@Bean
@ConfigurationProperties(prefix = "awler")
public DataSource crawlerDataSource(){
ate().build();
}
@Bean : 将其表⽰为spring的bean,让spring进⾏管理
@Primary : 指定同⼀个接⼝有多个实现类可以注⼊的时候 , 默认注⼊哪⼀个
@ConfigurationProperties : 绑定配置⽂件中的属性到bean中
2) 配置SqlSessionFactory
@Bean
@Primary
public SqlSessionFactory vxSqlSessionFactory(@Qualifier("vxDataSource")DataSource vxDataSource) throws Exception{
SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
fb.setDataSource(vxDataSource);
fb.setTypeAliasesPackage("boot.datasource");
fb.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/vx/**/*.xml")
);
Object();
}
@Bean
public SqlSessionFactory crawlerSqlSessionFactory(@Qualifier("crawlerDataSource")DataSource crawlerDataSource) throws Exception{
SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
fb.setDataSource(crawlerDataSource);
fb.setTypeAliasesPackage("boot.datasource");
fb.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/crawler/**/*.xml")
);
Object();
}
每⼀个SqlSessionFactory都设置了⼀个DataSource属性 , 所以他们产⽣的SqlSession就是不同数据库的SqlSession ; 另外TypeAliasesPackage属性表⽰扫描该属性下的全部java⽂件作为别名 , 即l⽂件中 select 标签 resultType属性的值 ,如果不设置则要输⼊对应实体的全限定名称 , 设置之后只需输⼊对应实体的类名即可; MapperLocations 属性⽤于扫描指定⽂件下的哪些⽂件作为MyBatis的xml映射⽂件;
3)配置MapperScannerConfigurer
@Bean(name="vxMapperScannerConfigurer")
public MapperScannerConfigurer vxMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("vxSqlSessionFactory");
configurer.setBasePackage("boot.datasource");
configurer.setAnnotationClass(VXDao.class);
return configurer;
}
@Bean(name="crwalerMapperScannerConfigurer")
public MapperScannerConfigurer crwalerMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("crawlerSqlSessionFactory");
configurer.setBasePackage("boot.datasource");
configurer.setAnnotationClass(CrawlerDao.class);
return configurer;
}
MapperScannerConfigurer⽤于配置MyBatis Mapper接⼝的扫描 ; 该对象可以设置BasePackage 和 AnnotationClass属性,分别表⽰
扫描哪个包下的⽂件且标识了指定注解的接⼝ 作为MyBatis 的 Mapper , 同时还需设置⼀个SqlSessionFactory;
VXDao.class 和 CrawlerDao.class是我⾃定义的两个运⾏期且只能注解在类上的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface VXDao {
String value() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Component
public @interface CrawlerDao {
String value() default "";
};
4)配置 事务管理器
@Bean(name="vxTransactionManager")
@Primary
public DataSourceTransactionManager vxTransactionManager(@Qualifier("vxDataSource")DataSource vxDataSource) throws Exception{
return new DataSourceTransactionManager(vxDataSource);
}
@Bean(name="crawlerTransactionManager")
public DataSourceTransactionManager crawlerTransactionManager(@Qualifier("crawlerDataSource")DataSource crawlerDataSource) throws Exception{        return new DataSourceTransactionManager(crawlerDataSource);
}
事务管理器只需要指定对应的DataSource即可
5)总结
以上步骤配置完成之后 , 只需要在对应的Dao接⼝上添加上 @VXDao 或 @CrawlerDao 注解 , 即可完成多数据源的访问 , 每⼀个注解对应
⼀个数据源;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。