-
1.数据源扫描的mapper路径要对应:分包配置,两种包格式
-
2.数据源读取对应的配置名称要对应
-
3.主配置数据源和主事务一定加 @Priamry
目录结构:分包配置
步骤:
- 1.创建两个/多个数据库
- 2.resources/application.properties 配置多个数据源配置
-
#数据源配置 #数据源1 主数据源 spring.datasource.sbtest1.driverClassName=com.mysql.jdbc.Driver spring.datasource.sbtest1.url=jdbc:mysql://localhost:3306/sbtest1?useUnicode=true&characterEncoding=utf-8 spring.datasource.sbtest1.username=root spring.datasource.sbtest1.password=root #数据源2 spring.datasource.sbtest2.driverClassName=com.mysql.jdbc.Driver spring.datasource.sbtest2.url=jdbc:mysql://localhost:3306/sbtest2?useUnicode=true&characterEncoding=utf-8 spring.datasource.sbtest2.username=root spring.datasource.sbtest2.password=root
- 3.主数据源 datasource/DataSource01.class
//注解到springboot容器中 @Configuration //对应目录结构1 @MapperScan(basePackages = "com.zjc.sbtest1.mapper", sqlSessionFactoryRef = "sbtest1SqlSessionFactory") //对应目录结构2 //@MapperScan(basePackages = "com.zjc.mapper.sbtest1", sqlSessionFactoryRef = "sbtest1SqlSessionFactory") public class DataSource01 { //获取sbtest1数据库的数据源 @Bean(name = "sbtest1DataSource") @Primary //主数据源 //prefix前缀名和application.properties中对应的数据源一样 @ConfigurationProperties(prefix = "spring.datasource.sbtest1") public DataSource dateSource() { return DataSourceBuilder.create().build(); } //返回sbtest1数据库的会话工厂 @Bean(name = "sbtest1SqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("sbtest1DataSource") DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); return bean.getObject(); } //返回sbtest1数据库的事务 @Bean(name = "sbtest1TransactionManager") @Primary //主事务 public DataSourceTransactionManager transactionManager(@Qualifier("sbtest1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //返回sbtest1数据库的会话模版 @Bean(name = "sbtest1SqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate( @Qualifier("sbtest1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
-
3.配置其他数据源DataSource02.class
- 一个应用只能有一个主数据源和主事务,可以有多个非主数据源和事务。只在主数据源中写两个@priamary,其它数据源和事务不能写
-
//注解到springboot容器中 @Configuration //对应目录结构1 @MapperScan(basePackages = "com.zjc.sbtest2.mapper", sqlSessionFactoryRef = "sbtest2SqlSessionFactory") //对应目录结构2 //@MapperScan(basePackages = "com.zjc.mapper.sbtest2", sqlSessionFactoryRef = "sbtest2SqlSessionFactory") public class DataSource02 { //返回sbtest2数据库的数据源 @Bean(name = "sbtest2DataSource") @ConfigurationProperties(prefix = "spring.datasource.sbtest2") public DataSource dateSource() { return DataSourceBuilder.create().build(); } //返回sbtest2数据库的会话工厂 @Bean(name = "sbtest2SqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("sbtest2DataSource") DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); return bean.getObject(); } //返回sbtest2数据库的事务 @Bean(name = "sbtest2TransactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("sbtest2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //返回sbtest2数据库的会话模版 @Bean(name = "sbtest2SqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate( @Qualifier("sbtest2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
- 4.App.class
-
//根据目录结构选择扫描路径 @EnableAutoConfiguration //@MapperScan(basePackages = "com.zjc.mapper") @ComponentScan(basePackages = {"com.zjc.web", "com.zjc.sbtest1","com.zjc.sbtest2","com.zjc.datasource"}) //@ComponentScan(basePackages = {"com.zjc.web", "com.zjc.service","com.zjc.datasource"}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }