1:首先在springboot的 main启动类上加
// boot自带的DataSourceAutoConfiguration禁掉,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源。在@SpringBootApplication注解中添加exclude属性即可:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
2:修改properties..文件 增加数据源
#\u6570\u636E\u6E901
spring.datasource.aw.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.aw.driverClassName=com.mysql.jdbc.Driver
spring.datasource.aw.url=jdbc:mysql://locahost111:3306/tttt?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.aw.username=root
spring.datasource.aw.password=1111
spring.datasource.aw.initialSize=20
spring.datasource.aw.minIdle=10
spring.datasource.aw.maxActive=100
#\u6570\u636E\u6E902
spring.datasource.xyias.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.xyias.driverClassName=com.mysql.jdbc.Driver
spring.datasource.xyias.url=jdbc:mysql://locahost222:3306/xxx?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.xyias.username=root
spring.datasource.xyias.password=2222
spring.datasource.xyias.initialSize=20
spring.datasource.xyias.minIdle=10
spring.datasource.xyias.maxActive=100
3:DataSourceConfig 对 properties读取 这里创建了2个Bean
,由dbOneDataSource
和 dbTwoDataSource
读取并创建数据源。
package com.swbxcx.core.main.config;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class DataSourceConfig {
@Bean(name = "dbOneDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.aw") // application.yml 中对应属性的前缀
public DataSource dbOneDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dbTwoDataSource")
@ConfigurationProperties(prefix = "spring.datasource.xyias") // application.yml 中对应属性的前缀
public DataSource dbTwoDataSource() {
return DataSourceBuilder.create().build();
}
}
4:数据源创建
如果有多个就直接创建多个,下面说说 SqlSessionFactory && SqlSessionTemplate
创建 。
package com.swbxcx.core.main.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.annotation.Resource;
import javax.sql.DataSource;
public class MybatisConfig {
/**
* 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建
*/
@Configuration
@MapperScan(basePackages = {
"com.swbxcx.core.main.aw.mapper" }, sqlSessionFactoryRef = "sqlSessionFactoryOne", sqlSessionTemplateRef = "sqlSessionTemplateOne")
public static class DBOne {
@Resource
DataSource dbOneDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryOne() throws Exception {
System.err.println("sqlSessionFactoryOne 创建成功。");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbOneDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mybatis-mapping-one/*Mapper.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
return template;
}
}
/**
* 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建
*/
@Configuration
@MapperScan(basePackages = {
"com.swbxcx.core.main.xy.mapper" }, sqlSessionFactoryRef = "sqlSessionFactoryTwo", sqlSessionTemplateRef = "sqlSessionTemplateTwo")
public static class DBTwo {
@Resource
DataSource dbTwoDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryTwo() throws Exception {
System.err.println("sqlSessionFactoryTwo 创建成功。");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbTwoDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mybatis-mapping-two/*Mapper.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory
return template;
}
}
}
这里要详细说明的一下,因为创建了2套的SqlSessionFactory && SqlSessionTemplate
,那怎么来区分或者说怎么分配数据源呢?
通过注释 :basePackages = {"com.sojson.datasource.one.mapper"}
来定义第一个数据源 SqlSessionFactory
的mapper
目录。
通过注释 :basePackages = {"com.sojson.datasource.two.mapper"}
来定义第二个数据源 SqlSessionFactory
的mapper
目录。
5:多数据源测试
@Controller
public class SwbProductController {
@Autowired
SwbXcxUserServices swbXcxUserServices;
@Autowired
SwbXcxAwUserService swbXcxAwUserService;
//对应的数据源2
@GetMapping(value = "/cst/ghj")
@ResponseBody
public AjaxResult admintype(int id) {
IasUser iasUser = swbXcxUserServices.findIdByUserObj(id);
return new AjaxResult(iasUser);
}
//对应的数据源1
@GetMapping(value = "/cstnb/ghsj")
@ResponseBody
public AjaxResult admintypegh(int id) {
AiwoUser iasUser = swbXcxAwUserService.findIdByUserObj(id);
return new AjaxResult(iasUser);
}
}