zoukankan      html  css  js  c++  java
  • Spring Boot2.0之整合多数据源

    一般公司分两个数据库:

     一个放共同配置文件, 一个数据库垂直业务数据库

    垂直拆分和水平拆分:

      垂直是根据业务划分具体数据库 

    在一个项目中有多个数据源(不同库jdbc) 无限个的哈~ 根据包名 或者 注解方式 划分多个数据源

     本博客讲解的是分包情况下的:

    首先创建两个包 

       

    数据库也是如此:

      

    当前的目录结构这样:

    根据不同的包名字,连接不同的数据源

    pom文件如下所示:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>multipleDatasource</groupId>
      <artifactId>com.toov5.multiple</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
      <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.0.RELEASE</version>
    	</parent>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter</artifactId>
    		</dependency>
    		<!-- 测试 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.mybatis.spring.boot</groupId>
    			<artifactId>mybatis-spring-boot-starter</artifactId>
    			<version>1.1.1</version>
    		</dependency>
    		<!-- mysql 依赖 -->
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    		</dependency>
    		<!-- springboot-web组件 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		      <dependency>
                  <groupId>org.projectlombok</groupId>
                   <artifactId>lombok</artifactId>
           </dependency>
    		
    		
    	</dependencies>
      
    </project>

     数据源的配置文件:application.properties

    ###datasource1
    spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
    spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
    spring.datasource.test1.username = root
    spring.datasource.test1.password = root
    ###datasource2
    spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
    spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
    spring.datasource.test2.username = root
    spring.datasource.test2.password = root

    datasource包下面的相关配置的Java代码:

    package com.toov5.datasource;
    
    import javax.sql.DataSource;
    
    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.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    //DataSource01数据源的读取
    @Configuration // 注册到springboot容器中  
    @MapperScan(basePackages = "com.toov5.test01", sqlSessionFactoryRef = "test1SqlSessionFactory") 
    //指向了下面的名为 test1SqlSessionFactory 的工厂
    public class DataSource1Config {
    
        @Bean(name = "test1DataSource")  //表示注入到Spring 容器中去
        @ConfigurationProperties(prefix = "spring.datasource.test1")  //表以此为开头,去properties去读 ( 后面是写死的)
        @Primary
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        
        @Bean(name = "test1SqlSessionFactory") // 
        @Primary
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
                throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // bean.setMapperLocations(
            // new
            // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
            // 如果有一些mapper文件的话 可以把上面的注解放开
            return bean.getObject();
        }
    
        
        @Bean(name = "test1TransactionManager")  //配置事务
        @Primary
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test1SqlSessionTemplate")
        @Primary
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }

    package com.toov5.datasource;
    
    import javax.sql.DataSource;
    
    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.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
     //DataSource2
    @Configuration // 注册到springboot容器中
    @MapperScan(basePackages = "com.toov5.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
    public class DataSource2Config {
    
        
        @Bean(name = "test2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.test2")
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        
        @Bean(name = "test2SqlSessionFactory")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
                throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // bean.setMapperLocations(
            // new
            // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml"));
            return bean.getObject();
        }
    
        
        @Bean(name = "test2TransactionManager")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test2SqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }

    然后相应的实体类代码:

    package com.toov5.entity;
    
    import lombok.Data;
    
    @Data  
    public class User {
      private Integer age;
      private String name;
      private  Integer id;
        
    }

    mappertest01和mappertest02

    package com.toov5.mappertest01;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Param;
    
    public interface UserMapperTest01 {
        @Insert("insert into users values(null,#{name},#{age});")
        public int insert(@Param("name") String name, @Param("age") Integer age);
    
    }

    package com.toov5.mappertest02;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Param;
    
    public interface UserMapperTest02 {
        @Insert("insert into users values(null,#{name},#{age});")
        public int insert(@Param("name") String name, @Param("age") Integer age);
    
    }

    service01和service02

    package com.toov5.service01;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.toov5.mappertest01.UserMapperTest01;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Service
    @Slf4j
    public class UserService01 {
      @Autowired
      private UserMapperTest01 userMapperTest01;
      
      public int insertUser(String name, Integer age){
         int result = userMapperTest01.insert(name, age);
          log.info("####################",result);
          return result;
      }
    }

    package com.toov5.service02;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.toov5.mappertest02.UserMapperTest02;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Service
    @Slf4j
    public class UserService02 {
      @Autowired
      private UserMapperTest02 userMapperTest02;
      
      public int insertUser(String name, Integer age){
         int result = userMapperTest02.insert(name, age);
          log.info("####################",result);
          return result;
      }
    }

     controller类

    package com.toov5.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.toov5.test01.service01.UserService01;
    
    @RestController
    public class MultiplyController {
        @Autowired
        private UserService01 userService01;
        
        @Autowired
        private UserService01 userService02;
        
        @RequestMapping("/insertUser01")
        public Integer insertUser1(String name, Integer age){
            return userService01.insertUser(name, age);
        }
        
        @RequestMapping("/insertUser02")
        public Integer insertUser2(String name, Integer age){
            return userService02.insertUser(name, age);
        }
        
    }

    启动类:

    package com.toov5.app;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication(scanBasePackages={"com.toov5.*"})
    public class app {
    
        public static void main(String[] args) {
            SpringApplication.run(app.class, args);
        }
        
    }

     启动后访问:

    数据库:

     访问:

    数据库结果:

    注:spring1.5时候 默认只想数据源 会报错~    2.0之后得到了修复

  • 相关阅读:
    LeetCode c++-- 118.杨辉三角
    LeetCode c++ --896. 单调数列
    LeetCode c++--1551. 使数组中所有元素相等的最小操作数
    LeetCode c++:1550. 存在连续三个奇数的数组
    LeetCode c++--字符串转换整数 (atoi)
    c++ 顺序容器常用知识总结
    c++基础知识之容器一:顺序容器
    小菜鸡c++ LeetCode初级算法之一——数组(删除排序数组中的重复项)
    JVM
    BATCH、事务、CLOB、BLOB
  • 原文地址:https://www.cnblogs.com/toov5/p/9820082.html
Copyright © 2011-2022 走看看