Mybatis 使用多数据源配置 实现mybatis配置多个数据源,不同的mapper 使用不同的数据源
配置 修改连接信息 将数据库连接信息,由一个改成多个,可以加上一些前缀标识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #data source config1 spring.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.master.jdbc-url= spring.datasource.master.username=root spring.datasource.master.password=12345 #data source config2 spring.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.slave.jdbc-url= spring.datasource.slave.username=root spring.datasource.slave.password=12345
修改mybatis配置信息 多个DataSource
1 2 3 4 5 6 7 8 9 10 11 12 @Primary @Bean("master_dataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource paymentDataSource() { return DataSourceBuilder.create().build(); } @Bean("slave_dataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource paymentDataSource() { return DataSourceBuilder.create().build(); }
多个sqlsession Factory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Primary @Bean("master_sqlSessionFactory") public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master_dataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver(); //这里这里的xml路径 sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/a/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean("slave_SqlSessionFactory") public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slave_dataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/b/*.xml")); return sqlSessionFactoryBean.getObject(); }
注意:如果使用的是mybatis-plus ,那么这里需要new个 MybatisSqlSessionFactoryBean
多个SqlSessionTemplate
1 2 3 4 5 6 7 8 9 10 11 12 @Primary @Bean("master_SqlSessionTemplate") public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("master_sqlSessionFactory")SqlSessionFactory sqlSessionFactory) throws Exception { SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory); return sqlSessionTemplate; } @Bean("slave_SqlSessionTemplate") public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slave_SqlSessionFactory")SqlSessionFactory sqlSessionFactory) throws Exception { SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory); return sqlSessionTemplate; }
多个DataSourceTransactionManager
1 2 3 4 5 6 7 8 9 10 11 12 @Primary @Bean("master_TransactionManager") public DataSourceTransactionManager masterTransactionManager(@Qualifier("master_dataSource") DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; } @Bean("slave_TransactionManager") public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slave_dataSource") DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; }
修改@Mapper 注意 MapperScan 注解中的属性;
sqlSessionTemplateRef 和 sqlSessionFactoryRef 这2个值可以当spring中有多个bean的时候指定特定的bean
1 2 3 4 5 6 7 @MapperScan(basePackages = "com.mapper.a",sqlSessionFactoryRef = "master_SqlSessionFactory",sqlSessionTemplateRef = "master_SqlSessionTemplate") class A @MapperScan(basePackages = "com.mapper.b",sqlSessionFactoryRef = "slave_SqlSessionFactory",sqlSessionTemplateRef = "slave_SqlSessionTemplate") class B
要点:
多个相同类型的bean 注意指定 @Primary sqlsessionfactory 中的xml路径是不同的注意区分 @Qualifier 指定使用哪个bean的实现 @MapperScan 扫描时指定不同的扫描包,sessionfactroy 等信息