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 }
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 }
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的启动类:
启动项目:
数据库新增数据成功: