本文共 3651 字,大约阅读时间需要 12 分钟。
在传统的单体架构中,一个系统对应一个数据库,但在一个分布式系统中,比如微服务,每一个服务对应一个数据库,由于业务的需求,有时需要在一个服务中访问多个数据库的数据,需要配置多数据源,以下是SpringBoot 2.0.5 + MyBatis + .yml 格式配置多数据源的方法。
spring: datasource: article-service: driver-class-name: com.mysql.jdbc.Driver username: root password: roo jdbc-url: jdbc:mysql://localhost:3306/articleservice?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true video-service: driver-class-name: com.mysql.jdbc.Driver username: root password: roo jdbc-url: jdbc:mysql://localhost:3306/videoservice?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true# 端口设置server: port: 8083
在单数据源的配置中,数据库地址的写法是
url: jdbc:mysql://localhost:3306
多数据源中,需要在 url 前面加上 jdbc-
jdbc-url: jdbc:mysql://localhost:3306
创建多个配置类,每一个类对应一个数据源的配置,以下是一个数据源的配置。
@Configuration//配置mbatis接口@MapperScan(basePackages = "com.hly.springbootmybatismultidatasources.dao.ArticleService", sqlSessionFactoryRef = "articleServiceSqlSessionFactory")public class ArticleServiceDataSourceConfig { //将对象放入容器中 @Bean(name = "articleServiceDataSource") //表示默认数据源 @Primary //yml配置的对象 @ConfigurationProperties(prefix = "spring.datasource.article-service") public DataSource getArticleServiceDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "articleServiceSqlSessionFactory") @Primary //@Qualifier 查找Spring 容器中名为articleServiceDataSource的对象 public SqlSessionFactory articleServiceSqlSessionFactory(@Qualifier("articleServiceDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //配置Mybatis XML文件的位置 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/articleService/*.xml")); return bean.getObject(); } @Bean(name = "articleServiceSqlSessionTemplate") @Primary public SqlSessionTemplate articleServiceSqlSessionTemplate(@Qualifier("articleServiceSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); }}
每一个数据源对应的 Mapper 和 Dao 以不同的目录区分
DROP TABLE IF EXISTS `video`;CREATE TABLE `video`( `v_id` int(11) NOT NULL AUTO_INCREMENT, `v_name` varchar(20) NOT NULL DEFAULT '', `a_id` int(11) NOT NULL, PRIMARY KEY (`v_id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 DEFAULT CHARSET=utf8DROP TABLE IF EXISTS `article`;CREATE TABLE `article`( `a_id` int(11) NOT NULL AUTO_INCREMENT, `a_name` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`a_id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 DEFAULT CHARSET=utf8
@Repositorypublic interface ArticleDao { ListgetArticles();}
@Repositorypublic interface VideoDao { List
@RestControllerpublic class TestController { @Autowired ArticleDao articleDao; @Autowired VideoDao videoDao; @RequestMapping(value = "/articles") public Object getArticle(){ return articleDao.getArticles(); } @RequestMapping(value = "/videos") public Object getVideoByArticleId(int a_id){ return videoDao.getVideoByArticleId(a_id); }}
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://ndfsi.baihongyu.com/