springBoot整合多数据源
springBoot整合相关
1:springBoot整合多数据源:
应用场景: 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库。
工具/版本:
jdk1.8、idea2018.1.4、springBoot2.0.1
注意:一定要统一版本,特别是springBoot不然或出问题。
创建项目:
我这里的项目与上一篇的springBoot整合mybatis、jsp是一样的就不重新建了。
下面我们看一下项目结构:
红框表示整合多数据源用到的模块:

下面我们开始整合:
1:首先:我们在application.properties配置文件中配置两个数据源:
application.properties :
#test01 datasource
spring.datasource.hikari.test1.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.hikari.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.hikari.test1.username = root
spring.datasource.hikari.test1.password = admin ####test02 datasource
spring.datasource.hikari.test2.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.hikari.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.hikari.test2.username = root
spring.datasource.hikari.test2.password = admin
2: 然后新建dataSource包 :参考上面的项目结构
新建类:Datasource1Config :
注:该数据源只针对下面的test1包下面的所有方法
package com.dengwei.springdemo.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; import javax.sql.DataSource;
/*
* @Configuration :// 注册到springBoot容器中
* @MapperScan(basePackages = "com.dengwei.springdemo.test1", sqlSessionFactoryRef = "sqlSessionFactory1")
* 当前扫描包:com.dengwei.springdemo.test1下使用此数据源;sqlSessionFactoryRef:对应下面的sql回话工厂
* @Bean(name = "DataSource1") :给当前注入的bean对象取的名字
* @ConfigurationProperties(prefix = "spring.datasource.hikari.test1") application.properteis中对应属性的前缀
* @Primary : 设置默认数据源,当多个数据源时,不加会报错
*/
@Configuration
@MapperScan(basePackages = "com.dengwei.springdemo.test1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config { /**
*
* @methodDesc: 功能描述:(配置test1数据库)
*/
@Bean(name = "DataSource1")
@ConfigurationProperties(prefix = "spring.datasource.hikari.test1")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
} /**
*
* @methodDesc: 功能描述:(test1 sql会话工厂)
* @returnType:@param dataSource
* @returnType:@throws Exception SqlSessionFactory */
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource1") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//mybatis写配置文件(sql映射)需要加下面的代码
// bean.setMapperLocations(
// new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
return bean.getObject();
} /**
*
* @methodDesc: 功能描述:(test1 事物管理)
*/
@Bean(name = "test1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource1") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
2:再建类 DataSource2Config : (基本上和DataSource1Config一样只是数据源名字不一样)
该数据源针对下面的test2包下面的方法:
package com.dengwei.springdemo.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; import javax.sql.DataSource; /*
* @Configuration :// 注册到springBoot容器中
* @MapperScan(basePackages = "com.dengwei.springdemo.test2", sqlSessionFactoryRef = "SqlSessionFactory2")
* 当前扫描包:com.dengwei.springdemo.test2 下使用此数据源;sqlSessionFactoryRef:对应下面的sql回话工厂
* @Bean(name = "DataSource2") :给当前注入的bean对象取的名字
* @ConfigurationProperties(prefix = "spring.datasource.hikari.test2") application.properteis中对应属性的前缀
*
*/
@Configuration
@MapperScan(basePackages = "com.dengwei.springdemo.test2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config { /**
*
* @methodDesc: 功能描述:(配置test2数据库)
*/
@Bean(name = "DataSource2")
@ConfigurationProperties(prefix = "spring.datasource.hikari.test2")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
} /**
*
* @methodDesc: 功能描述:(test2 sql会话工厂)
* @returnType:@param dataSource
* @returnType:@throws Exception SqlSessionFactory */
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource2") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//mybatis写配置文件(sql映射)需要加下面的代码
// bean.setMapperLocations(
// new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
return bean.getObject();
} /**
*
* @methodDesc: 功能描述:(test2 事物管理)
*/
@Bean(name = "test2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "test2SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
3 :建两个数据的映射 接口 test1、test2:
这里sql我用的是注解的方式:
test1 ----- IUserMapper1:
package com.dengwei.springdemo.test1; import com.dengwei.springdemo.model.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; public interface IUserMapper1 { @Select("SELECT id,user_name userName, pass_word password FROM user WHERE id = #{id}")
User queryById(@Param("id") Integer id); @Insert("INSERT INTO `user` (user_name, password) VALUES (#{userName},#{password})")
void saveUser(@Param("userName") String userName, @Param("password") String password);
}
test2 ---IUserMapper2 :
与 IuserMapper1 中的方法一样,只是操作不同的数据库
package com.dengwei.springdemo.test2; import com.dengwei.springdemo.model.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; public interface IUserMapper2 { @Select("SELECT id,user_name userName, pass_word password FROM user WHERE id = #{id}")
User queryById(@Param("id") Integer id); @Insert("INSERT INTO `user` (user_name, password) VALUES (#{userName},#{password})")
void saveUser(@Param("userName") String userName, @Param("password") String password);
}
4:建一个UserController2类 :
测试两个包下面针对不同数据源的操作
package com.dengwei.springdemo.controller; import com.dengwei.springdemo.model.User;
import com.dengwei.springdemo.test1.IUserMapper1;
import com.dengwei.springdemo.test2.IUserMapper2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/user2")
public class UserController2 {
@Autowired
private IUserMapper1 userMapper1;
@Autowired
private IUserMapper2 userMapper2; @RequestMapping("/userMapper1")
@ResponseBody
public String testUserMapper1(String name,String password){
userMapper1.saveUser(name,password);
return "success";
}
@RequestMapping("/userMapper2")
@ResponseBody
public String testUserMapper2(String name,String password){
userMapper2.saveUser(name, password);
return "success";
}
}
下面我们看一下springBoot的启动类:

启动项目:

数据库新增数据成功:

springBoot整合多数据源的更多相关文章
- springboot整合多数据源解决分布式事务
一.前言 springboot整合多数据源解决分布式事务. 1.多数据源采用分包策略 2.全局分布式事务管理:jta-atomikos. ...
- SpringBoot整合多数据源实现
项目架构 1.导入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- springboot整合多数据源及事物
有两种方式:一种是分包的方式.一种是加注解的方式(@DataSource(ref="")). 分包方式:项目结构图如下: 分为com.itmayiedu.test01.com.it ...
- SpringBoot整合Druid数据源
关于SpringBoot数据源请参考我上一篇文章:https://www.cnblogs.com/yueshutong/p/9409295.html 一:Druid介绍 1. Druid是什么? Dr ...
- SpringBoot整合Mybatis【非注解版】
接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 选择Spring Initializr,配置JDK版本 输入项目名 选择构建web项目所需的state ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- SpringBoot整合阿里Druid数据源及Spring-Data-Jpa
SpringBoot整合阿里Druid数据源及Spring-Data-Jpa https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=224 ...
- SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...
- SpringBoot整合Mybatis多数据源 (AOP+注解)
SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...
随机推荐
- SQL循环语句 详解
SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+ ...
- 【BZOJ5321】[JXOI2017]加法(贪心)
[BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...
- [NOI2014]购票(斜率优化+线段树)
题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接 ...
- java实现sftp客户端上传文件以及文件夹的功能
1.依赖的jar文件 jsch-0.1.53.jar 2.登录方式有密码登录,和密匙登录 代码: 主函数: import java.util.Properties; import com.cloudp ...
- Linux系统状态监控小工具 - Linux Dash
Linux Dash是一个简单易用的Linux系统状态监控工具,项目地址:https://github.com/afaqurk/linux-dash 1.安装Apache服务: [root@local ...
- ELK日志系统安装、配置
1.关闭SELINUX: [root@ELK /]# vim /etc/selinux/config 将SELINUX=enforcing修改为SELINUX=disabled 2.关闭防火墙: [r ...
- 百度地图API:自定义控件
HTML: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- 洛谷P3620 数据备份
好吧,我一开始说这是个神级数据结构毒瘤题,后来改成神题了. 主要是贪心做法的巧妙转化: 首先发现选择的一对必须相邻,于是我们搞出差分. 然后考虑选取最小值时,最小值两侧的数要么同时选,要么都不选. 然 ...
- 【洛谷P2142 高精度减法】
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 复制 2 1 输出样例#1: 复制 1 说明 ...
- python基础之IO编程
读文件 with open('/path/to/file', 'r') as f: print(f.read()) 调用read()会一次性读取文件的全部内容,read()函数里面可以传入每次最多读取 ...