springboot + mybatis 多数据源

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);
	}

}

猜你喜欢

转载自blog.csdn.net/wangbo54979/article/details/81238314