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的启动类:

 启动项目:


 数据库新增数据成功:


原文地址:https://www.cnblogs.com/dw3306/p/9608497.html