Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】
由于要做复杂的数据迁移,直接 Mysql 数据库中用 sql 做迁移,难度太大, SQL 操作起来很复杂,而且也不现实。
为了可以让同学们可以直接使用,在 Springboot 结合 Mybatis 同时加入了我以往的 Freemarker ,作为View
层渲染。
一、Springboot + Mybatis 多数据源配置
1.Springboot.yml配置文件
server:
port: 9281
#spring:
# profiles:
# active: dev
#数据库1
datasource1:
url: jdbc:mysql://localhost:3306/ios666_history?useSSL=false&useUnicode=true
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
#数据库2
datasource2:
url: jdbc:mysql://localhost:3306/av8d?useSSL=false&useUnicode=true
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
2.SpringbootApplication 禁止加载自身对DataSource的扫描
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
public class DatasourceApplication {
public static void main(String[] args) {
SpringApplication.run(DatasourceApplication.class, args);
}
}
3.DataSourceConfig 对 Springboot.yml 读取
@Configuration
public class DataSourceConfig {
@Bean(name = "dbOneDataSource")
@Primary
@ConfigurationProperties(prefix = "datasource1") // application.yml 中对应属性的前缀
public DataSource dbOneDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dbTwoDataSource")
@ConfigurationProperties(prefix = "datasource2") // application.yml 中对应属性的前缀
public DataSource dbTwoDataSource() {
return DataSourceBuilder.create().build();
}
}
这里创建了2个Bean
,由dbOneDataSource
和 dbTwoDataSource
读取并创建数据源。
二、数据源的创建
如果有多个就直接创建多个,下面说说 SqlSessionFactory && SqlSessionTemplate
创建 。为了方便管理,我用内部类去解决。
package com.sojson.datasource.config;
import lombok.extern.slf4j.Slf4j;
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;
/**
*
* 开发公司:SOJSON在线工具 <p>
* 版权所有:© www.sojson.com<p>
* 博客地址:https://www.sojson.com/blog/ <p>
* <p>
* 说明:<br/>
*
* 如果有多个就直接创建多个,SqlSessionFactory && SqlSessionTemplate 创建
* <p>
*
* 区分 责任人 日期 <br/>
* 创建 周柏成 2018年05月01日22:33:18 <br/>
*
* @author zhou-baicheng
* @email so@sojson.com
* @version 1.0<br/>
*
*/
@Slf4j
public class MybatisConfig {
/**
* 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建
*/
@Configuration
@MapperScan(basePackages = {"com.sojson.datasource.one.mapper"},
sqlSessionFactoryRef = "sqlSessionFactoryOne",
sqlSessionTemplateRef = "sqlSessionTemplateOne")
public static class DBOne{
@Resource
DataSource dbOneDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryOne() throws Exception {
log.info("sqlSessionFactoryOne 创建成功。");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbOneDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
return template;
}
}
/**
* 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建
*/
@Configuration
@MapperScan(basePackages = {"com.sojson.datasource.two.mapper"},
sqlSessionFactoryRef = "sqlSessionFactoryTwo",
sqlSessionTemplateRef ="sqlSessionTemplateTwo" )
public static class DBTwo{
@Resource
DataSource dbTwoDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryTwo() throws Exception {
log.info("sqlSessionFactoryTwo 创建成功。");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbTwoDataSource);
、、
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/two/*.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
目录。
三、多数据源测试
package com.sojson.datasource.web.controller;
import com.sojson.datasource.common.model.Stock;
import com.sojson.datasource.one.mapper.OneStockMapper;
import com.sojson.datasource.two.mapper.TwoStockMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RequestMapping("api")
@RestController
public class IndexController {
@Autowired
OneStockMapper oneStockMapper;
@Autowired
TwoStockMapper twoStockMapper;
@RequestMapping("")
public Map<String,Object> index(){
Map<String,Object> result = new HashMap<>();
//第一个数据源
Stock entity = oneStockMapper.selectByPrimaryKey(1);
//第二个数据查询
Stock twoEntity = twoStockMapper.selectByPrimaryKey(1);
result.put("entity",entity);
result.put("twoEntity",twoEntity);
return result;
}
}
代码已经开源提交到gitee
上,地址为:https://gitee.com/jsonla/sojson.datasource.git
有问题加群交流。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/301.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。