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=& ...
随机推荐
- [APIO2012]守卫
近日状态并不是很好, 很不稳, 思路也不是很清晰 希望自己能走出来 题意:有序列1~n 现给出两种区间 区间0:序号在[x, y]的节点不能有忍者 区间1:序号在[x, y]的节点区间里至少有一个忍者 ...
- 原生JS节点操作
获取子节点 1. children 不是标准的dom属性,但是几乎被所有浏览器支持.获取子元素的元素节点(只包括元素节点) 注意:在IE中,children包含注释节点. 2. childNodes ...
- 「SDOI2014」向量集 解题报告
「SDOI2014」向量集 维护一个向量集合,在线支持以下操作: A x y :加入向量 \((x, y)\): Q x y l r:询问第 \(L\) 个到第 \(R\) 个加入的向量与向量 \(( ...
- bzoj1226/luogu2157 学校食堂 (状压dp)
我们先约定:(左) 窗口_人人人人人 (右) 可以发现,我们只需要知道最靠左的还没打饭的人 以及它身后7个人的状态 以及上一个打饭的人是谁 因为他左面的就都打过了 右面7个人以后肯定还没打 可以设f[ ...
- poj 3666 Making the Grade(离散化+dp)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- NowCoder--牛客练习赛30 C_小K的疑惑
题目链接 :牛客练习赛30 C_小K的疑惑 i j k 可以相同 而且 距离%2 只有 0 1两种情况 我们考虑 因为要 d(i j)=d(i k)=d(j k) 所以我们只能找 要么三个点 任意两个 ...
- 使用Spring Cloud连接不同服务
http://www.infoq.com/cn/articles/spring-cloud-service-wiring 主要结论 Spring Cloud为微服务系统中相互依赖的服务提供了丰富的连接 ...
- 洛谷P2414 阿狸的打字机
题意:以trie的形式给出n个字符串,每次询问第x个字符串在第y个字符串中出现了几次. 解:总串长是n2级别的,所以不能用什么后缀自动机... [update]可以建triesam但是不知道trie上 ...
- 跟我一起用node-express搭建一个小项目(node连接mongodb)[三]
数据库虽然安装并启动成功了,但我们需要连接数据库后才能使用数据库. 怎么才能在 Node.js 中使用 MongoDB 呢? 我们使用官方提供的 node-mongodb-native 驱动模块,打开 ...
- springboot 新模板 呵呵了
<html> <head> <title>批处理任务管理</title> <meta name="decorator" con ...