zoukankan      html  css  js  c++  java
  • springBoot整合多数据源

    springBoot整合相关

    1:springBoot整合多数据源:

     应用场景:     项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库。

    工具/版本:

        jdk1.8、idea2018.1.4、springBoot2.0.1

    注意:一定要统一版本,特别是springBoot不然或出问题。

    创建项目:

        我这里的项目与上一篇的springBoot整合mybatis、jsp是一样的就不重新建了。

    下面我们看一下项目结构:

    红框表示整合多数据源用到的模块:

    下面我们开始整合:

     1:首先:我们在application.properties配置文件中配置两个数据源:

    application.properties   :

     1 #test01 datasource
     2 spring.datasource.hikari.test1.driver-class-name = com.mysql.jdbc.Driver
     3 spring.datasource.hikari.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
     4 spring.datasource.hikari.test1.username = root
     5 spring.datasource.hikari.test1.password = admin
     6 
     7 ####test02 datasource
     8 spring.datasource.hikari.test2.driver-class-name = com.mysql.jdbc.Driver
     9 spring.datasource.hikari.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
    10 spring.datasource.hikari.test2.username = root
    11 spring.datasource.hikari.test2.password = admin

    2: 然后新建dataSource包 :参考上面的项目结构

    新建类:Datasource1Config :

    注:该数据源只针对下面的test1包下面的所有方法

     1 package com.dengwei.springdemo.dataSource;
     2 
     3 import org.apache.ibatis.session.SqlSessionFactory;
     4 import org.mybatis.spring.SqlSessionFactoryBean;
     5 import org.mybatis.spring.SqlSessionTemplate;
     6 import org.mybatis.spring.annotation.MapperScan;
     7 import org.springframework.beans.factory.annotation.Qualifier;
     8 import org.springframework.boot.context.properties.ConfigurationProperties;
     9 import org.springframework.boot.jdbc.DataSourceBuilder;
    10 import org.springframework.context.annotation.Bean;
    11 import org.springframework.context.annotation.Configuration;
    12 import org.springframework.context.annotation.Primary;
    13 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    14 
    15 import javax.sql.DataSource;
    16 /*
    17  *  @Configuration :// 注册到springBoot容器中
    18  *  @MapperScan(basePackages = "com.dengwei.springdemo.test1", sqlSessionFactoryRef = "sqlSessionFactory1")
    19  *  当前扫描包:com.dengwei.springdemo.test1下使用此数据源;sqlSessionFactoryRef:对应下面的sql回话工厂
    20  *  @Bean(name = "DataSource1")  :给当前注入的bean对象取的名字
    21  *  @ConfigurationProperties(prefix = "spring.datasource.hikari.test1")   application.properteis中对应属性的前缀
    22  *  @Primary  : 设置默认数据源,当多个数据源时,不加会报错
    23  */
    24 @Configuration
    25 @MapperScan(basePackages = "com.dengwei.springdemo.test1", sqlSessionFactoryRef = "sqlSessionFactory1")
    26 public class DataSource1Config {
    27 
    28     /**
    29      *
    30      * @methodDesc: 功能描述:(配置test1数据库)
    31      */
    32     @Bean(name = "DataSource1")
    33     @ConfigurationProperties(prefix = "spring.datasource.hikari.test1")
    34     @Primary
    35     public DataSource testDataSource() {
    36         return DataSourceBuilder.create().build();
    37     }
    38 
    39     /**
    40      *
    41      * @methodDesc: 功能描述:(test1 sql会话工厂)
    42      * @returnType:@param dataSource
    43      * @returnType:@throws Exception SqlSessionFactory
    44 
    45      */
    46     @Bean(name = "sqlSessionFactory1")
    47     @Primary
    48     public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource1") DataSource dataSource)
    49             throws Exception {
    50         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    51         bean.setDataSource(dataSource);
    52         //mybatis写配置文件(sql映射)需要加下面的代码
    53 //         bean.setMapperLocations(
    54 //                 new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
    55         return bean.getObject();
    56     }
    57 
    58     /**
    59      *
    60      * @methodDesc: 功能描述:(test1 事物管理)
    61      */
    62     @Bean(name = "test1TransactionManager")
    63     @Primary
    64     public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource1") DataSource dataSource) {
    65         return new DataSourceTransactionManager(dataSource);
    66     }
    67 
    68     @Bean(name = "test1SqlSessionTemplate")
    69     @Primary
    70     public SqlSessionTemplate testSqlSessionTemplate(
    71             @Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
    72         return new SqlSessionTemplate(sqlSessionFactory);
    73     }
    74 
    75 }

    2:再建类  DataSource2Config  : (基本上和DataSource1Config一样只是数据源名字不一样)

    该数据源针对下面的test2包下面的方法:

     1 package com.dengwei.springdemo.dataSource;
     2 
     3 import org.apache.ibatis.session.SqlSessionFactory;
     4 import org.mybatis.spring.SqlSessionFactoryBean;
     5 import org.mybatis.spring.SqlSessionTemplate;
     6 import org.mybatis.spring.annotation.MapperScan;
     7 import org.springframework.beans.factory.annotation.Qualifier;
     8 import org.springframework.boot.context.properties.ConfigurationProperties;
     9 import org.springframework.boot.jdbc.DataSourceBuilder;
    10 import org.springframework.context.annotation.Bean;
    11 import org.springframework.context.annotation.Configuration;
    12 import org.springframework.context.annotation.Primary;
    13 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    14 
    15 import javax.sql.DataSource;
    16 
    17 /*
    18  *  @Configuration :// 注册到springBoot容器中
    19  *  @MapperScan(basePackages = "com.dengwei.springdemo.test2", sqlSessionFactoryRef = "SqlSessionFactory2")
    20  *  当前扫描包:com.dengwei.springdemo.test2 下使用此数据源;sqlSessionFactoryRef:对应下面的sql回话工厂
    21  *  @Bean(name = "DataSource2")  :给当前注入的bean对象取的名字
    22  *  @ConfigurationProperties(prefix = "spring.datasource.hikari.test2")   application.properteis中对应属性的前缀
    23  *
    24  */
    25 @Configuration
    26 @MapperScan(basePackages = "com.dengwei.springdemo.test2", sqlSessionFactoryRef = "sqlSessionFactory2")
    27 public class DataSource2Config {
    28 
    29     /**
    30      *
    31      * @methodDesc: 功能描述:(配置test2数据库)
    32      */
    33     @Bean(name = "DataSource2")
    34     @ConfigurationProperties(prefix = "spring.datasource.hikari.test2")
    35     public DataSource testDataSource() {
    36         return DataSourceBuilder.create().build();
    37     }
    38 
    39     /**
    40      *
    41      * @methodDesc: 功能描述:(test2 sql会话工厂)
    42      * @returnType:@param dataSource
    43      * @returnType:@throws Exception SqlSessionFactory
    44 
    45      */
    46     @Bean(name = "sqlSessionFactory2")
    47     public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource2") DataSource dataSource)
    48             throws Exception {
    49         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    50         bean.setDataSource(dataSource);
    51         //mybatis写配置文件(sql映射)需要加下面的代码
    52 //         bean.setMapperLocations(
    53 //                 new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
    54         return bean.getObject();
    55     }
    56 
    57     /**
    58      *
    59      * @methodDesc: 功能描述:(test2 事物管理)
    60      */
    61     @Bean(name = "test2TransactionManager")
    62     public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource2") DataSource dataSource) {
    63         return new DataSourceTransactionManager(dataSource);
    64     }
    65 
    66     @Bean(name = "test2SqlSessionTemplate")
    67     public SqlSessionTemplate testSqlSessionTemplate(
    68             @Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
    69         return new SqlSessionTemplate(sqlSessionFactory);
    70     }
    71 
    72 }
    View Code

    3 :建两个数据的映射 接口 test1、test2:

    这里sql我用的是注解的方式:

    test1 -----  IUserMapper1:

     1 package com.dengwei.springdemo.test1;
     2 
     3 
     4 import com.dengwei.springdemo.model.User;
     5 import org.apache.ibatis.annotations.Insert;
     6 import org.apache.ibatis.annotations.Param;
     7 import org.apache.ibatis.annotations.Select;
     8 
     9 
    10 public interface IUserMapper1 {
    11 
    12     @Select("SELECT id,user_name userName, pass_word password FROM user WHERE id = #{id}")
    13     User queryById(@Param("id") Integer id);
    14 
    15     @Insert("INSERT INTO `user` (user_name, password) VALUES (#{userName},#{password})")
    16     void saveUser(@Param("userName") String userName, @Param("password") String password);
    17 }

     test2 ---IUserMapper2 :

     与 IuserMapper1  中的方法一样,只是操作不同的数据库

     1 package com.dengwei.springdemo.test2;
     2 
     3 
     4 import com.dengwei.springdemo.model.User;
     5 import org.apache.ibatis.annotations.Insert;
     6 import org.apache.ibatis.annotations.Param;
     7 import org.apache.ibatis.annotations.Select;
     8 
     9 
    10 public interface IUserMapper2 {
    11 
    12     @Select("SELECT id,user_name userName, pass_word password FROM user WHERE id = #{id}")
    13     User queryById(@Param("id") Integer id);
    14 
    15     @Insert("INSERT INTO `user` (user_name, password) VALUES (#{userName},#{password})")
    16     void saveUser(@Param("userName") String userName, @Param("password") String password);
    17 }
    View Code

     4:建一个UserController2类 :

    测试两个包下面针对不同数据源的操作

     1 package com.dengwei.springdemo.controller;
     2 
     3 import com.dengwei.springdemo.model.User;
     4 import com.dengwei.springdemo.test1.IUserMapper1;
     5 import com.dengwei.springdemo.test2.IUserMapper2;
     6 import org.springframework.beans.factory.annotation.Autowired;
     7 import org.springframework.stereotype.Controller;
     8 import org.springframework.web.bind.annotation.RequestMapping;
     9 import org.springframework.web.bind.annotation.ResponseBody;
    10 
    11 @Controller
    12 @RequestMapping("/user2")
    13 public class UserController2 {
    14     @Autowired
    15     private IUserMapper1 userMapper1;
    16     @Autowired
    17     private IUserMapper2 userMapper2;
    18 
    19     @RequestMapping("/userMapper1")
    20     @ResponseBody
    21     public String testUserMapper1(String name,String password){
    22         userMapper1.saveUser(name,password);
    23         return "success";
    24     }
    25     @RequestMapping("/userMapper2")
    26     @ResponseBody
    27     public String testUserMapper2(String name,String password){
    28          userMapper2.saveUser(name, password);
    29         return "success";
    30     }
    31 }

     下面我们看一下springBoot的启动类:

     启动项目:


     数据库新增数据成功:


  • 相关阅读:
    nodejs 不支持 typescript (...paramName:any[])剩余参数。变相支持方式。
    centos7安装nodejs
    .Net Core Linux centos7行—jenkins linux 构建.net core web app
    asp.net core 编译mvc,routing,security源代码进行本地调试
    发现一个很N且免费的html5拓扑图 关系图 生成组件
    Quill编辑器介绍及扩展
    vs2017 rc 离线安装包制作
    单体架构风格
    GlusterFS 安装 on centos7
    Expect 安装 on centos7
  • 原文地址:https://www.cnblogs.com/dw3306/p/9608497.html
Copyright © 2011-2022 走看看