前言在项目开发中,往往会涉及一个应用程序调用多个数据。今天给大家介绍一个SpringBoot+mybatis多数据源的解决方案。数据库准备创建两个数据库,两个数据库都有im_person表,两个表都没有数据。代码结构说明:我这里只是省略了service这一步,只是为了体现效果。各位开发者,不喜勿喷,谅解万岁,嘻嘻!!application.yml中配置了两个数据源如下:master:datasource:type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8用户名:root密码:123456slave:数据源:类型:com.alibaba.druid.pool.DruidDataSource驱动程序类名:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT%2B8用户名:root密码:1234562.SpringBoot多数据源配置类。@Configuration@MapperScan(basePackages="com.zhangls.multipledatasource.dao.master",sqlSessionFactoryRef="masterSqlSessionFactory")公共类MasterDataSourceConfig{@Value("${master.datasource.driver-class-name}")privateStringdriverClassName;@Value("${master.datasource.url}")私有字符串url;@Value("${master.datasource.username}")私有字符串用户名;@Value("${master.datasource.password}")私有字符串密码;@Bean(name="masterDataSource")@PrimarypublicDataSourcedataSource(){DruidDataSourcedataSource=newDruidDataSource();dataSource.setDriverClassName(this.driverClassName);dataSource.setUrl(this.url);dataSource.setUsername(this.username);dataSource.setPassword(this.password);返回数据源;}@Bean(name="masterSqlSessionFactory")@PrimarypublicSqlSessionFactorysqlSessionFactory(@Qualifier("masterDataSource")DataSourcedataSource)抛出异常{SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();bean.setDataSource(dataSource);ResourcePatternResolverresourceResolver=newPathMatchingResourcePatternResolver();ListmapperLocations=newArrayList<>();mapperLocations.add("类路径*:/mapper/master/*.xml");Listresources=newArrayList();如果(mapperLocations!=null){for(StringmapperLocation:mapperLocations){try{Resource[]mappers=resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));}catch(IOExceptione){//忽略}}}bean.setMapperLocations(resources.toArray(newResource[resources.size()]));返回bean.getObject();}@Bean(name="masterTransactionManager")@PrimarypublicDataSourceTransactionManagertransactionManager(@Qualifier("masterDataSource")DataSourcedataSource){returnnewDataSourceTransactionManager(dataSource);}@Bean(name="masterSqlSessionTemplate")@PrimarypublicSqlSessionTemplatetestSqlSessionTemplate(@Qualifier("masterSqlSessionFactory")复制代码SqlSessionFactorysqlSessionFactory)抛出异常{returnnewSqlSessionTemplate(sqlSessionFactory);}}@Configuration@MapperScan(basePackages="com.zhangls.multipledatasource.dao.slave",sqlSessionFactoryRef="slaveSqlSessionFactory")publicclassSlaveDataSourceConfig{@Value("${slave.datasource.driver-class-name}")privateStringdriverClassName;@Value("${slave.datasource.url}")privateStringurl;@Value("${slave.datasource.username}")privateString用户名;@Value("${slave.datasource.password}")私有字符串密码;@Bean(name="slaveDataSource")publicDataSourcedataSource(){DruidDataSource数据源=newDruidDataSource();dataSource.setDriverClassName(this.driverClassName);dataSource.setUrl(this.url);dataSource.setUsername(this.username);dataSource.setPassword(this.password);返回数据源;}@Bean(name="slaveSqlSessionFactory")publicSqlSessionFactorysqlSessionFactory(@Qualifier("slaveDataSource")DataSourcedataSource)throwsException{SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath*:/mapper/slave/*.xml"));返回bean.getObject();}@Bean(name="slaveTransactionManager")publicDataSourceTransactionManagertransactionManager(@Qualifier("slaveDataSource")DataSourcedataSource){returnnewDataSourceTransactionManager(da来源);}@Bean(name="slaveSqlSessionTemplate")publicSqlSessionTemplatetestSqlSessionTemplate(@Qualifier("masterSqlSessionFactory")SqlSessionFactorysqlSessionFactory)throwsException{returnnewSqlSessionTemplate(sqlSession}Factorywiththesamebasiccode}数据);最重要的是配置好扫描包的路径和mybatis的sql文件的路径,所以不同的连接DAO和mapper文件要放在不同的文件夹下,方便配置管理。实现效果上面的配置实现了多数据源的配置,下面实现一个功能。通过一个接口将不同的数据同时导入到两个库的两个表中。控制器代码如下:@RestControllerpublicclassDataSourceController{@ResourceprivateMasterPersonMappermasterPersonMapper;@ResourceprivateSlavePersonMapperslavePersonMapper;@GetMapping("/datasource")publicStringdatasource(){ImPersonperson1=newImPerson();person1.setPersonId("1");person1.setGender("男");person1.setBirthday(newDate());person1.setLocation("中国");masterPersonMapper.insertSelective(person1);ImPersonperson2=newImPerson();person2.setPersonId("2");person2.setGender("女");person2.setBirthday(新日期());person2.setLocation("中国北京");slavePersonMapper.insertSelective(person2);return"导入成功";}}执行:结果:可以看到两个库中的两个表都导入了数据。