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整合多数据源的更多相关文章

  1. springboot整合多数据源解决分布式事务

    一.前言        springboot整合多数据源解决分布式事务.             1.多数据源采用分包策略              2.全局分布式事务管理:jta-atomikos. ...

  2. SpringBoot整合多数据源实现

    项目架构 1.导入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  3. springboot整合多数据源及事物

    有两种方式:一种是分包的方式.一种是加注解的方式(@DataSource(ref="")). 分包方式:项目结构图如下: 分为com.itmayiedu.test01.com.it ...

  4. SpringBoot整合Druid数据源

    关于SpringBoot数据源请参考我上一篇文章:https://www.cnblogs.com/yueshutong/p/9409295.html 一:Druid介绍 1. Druid是什么? Dr ...

  5. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  6. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  7. SpringBoot整合阿里Druid数据源及Spring-Data-Jpa

    SpringBoot整合阿里Druid数据源及Spring-Data-Jpa https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=224 ...

  8. SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)

    1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...

  9. SpringBoot整合Mybatis多数据源 (AOP+注解)

    SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...

随机推荐

  1. C#版本和.NET版本以及VS版本的对应关系

    C#版本和.NET版本以及VS版本的对应关系 版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual ...

  2. Shell基础 - Bash基础功能

    历史命令 history选项: -c 清空历史命令 -w 立即保存历史命令Linux 下输入过的历史命令,都会保存在根目录下的:~/root/.bash_history 文件中默认保存 1000 条, ...

  3. Hdoj 1789 Doing Homework again 题解

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  4. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

  5. CF983A Finite or not?(数学)

    题意:给出分母,分子和进制,要求判断该数是否为有限小数. Solution 表示并不知道怎么判断. 度娘:“一个分数在最简分数的情况下,如果它的分母只含有2和5两个质因数,这个分数就能化成有限小数.” ...

  6. NOIP2017逛公园(dp+最短路)

    策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...

  7. Linux的wget命令详解【转载】

    Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...

  8. Vagrant 遇到的问题

    Vagrant was unable to mount VirtualBox shared folders. This is usuallybecause the filesystem "v ...

  9. 用foobar进行码率转换 适用与sacd-r转成低码率

    之前下载了不少高清音频,有黑胶转录的也有母带文件.这些高清音频大都是24bit,采样率96khz或者88.2khz或者更高.而我想将部分精品专辑刻录成cd.首先我需要将这些文件转换为16bit,44. ...

  10. 洛谷P3396 哈希冲突

    分块还真是应用广泛啊...... 题意:求 解:以n0.5为界. 当p小于n0.5的时候,直接用p²大小的数组储存答案. 预处理n1.5,修改n0.5. 当p大于n0.5的时候,直接按照定义计算,复杂 ...