Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】

JSON 2018-05-01 22:45:56 19647

由于要做复杂的数据迁移,直接  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

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Druid数据库配置详细介绍。网上一团糟。
PostgreSQL:数据库角色
PostgreSQL:数据库角色
Oracle数据库常用指令大全
Oracle数据库常用指令大全
oracle数据库和sql server的区别
redis数据库支持什么过期的管理特性?
oracle数据库和sql server的区别
MySQL数据库表怎么锁定
redis数据库支持什么过期的管理特性?
最新文章
Linux I/O重定向 1774
Ruby 循环 - while、for、until、break、redo 和 retry 739
Node.js:全局对象 540
如何使用终端检查Linux上的内存使用情况 667
JavaScript对象详细剖析 308
Python print() 函数 431
PHP if/else/elseif 语句 421
HTML5 Canvas弧线教程 411
Java赋值运算符 450
XML内部实体和外部实体 477
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 686873
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 675114
免费天气API,天气JSON API,不限次数获取十五天的天气预报 615859
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 611159
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 555638
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 510049
Elasticsearch教程(四) elasticsearch head 插件安装和使用 481433
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 269238
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244802
Elasticsearch教程(一),全程直播(小白级别) 227528
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...