在日常开发中我们可能会用到多数据源开发,什么是多数据源?

简单来讲的话,就是一个项目连接多个数据库。当然只是可能会用到,我暂时没见过应用场景,但是还是了解学习一下

此项目可以基于上一个简单集成项目进行简单的修改,就能实现多数据源了。

application.yml配置

我们在上一个项目的基础上进行修改,实现多数据源配置

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  5. username: root
  6. password: 123456
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. druid:
  9. one:
  10. username: root
  11. password: 123456
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  14. initialSize: 5
  15. minIdle: 5
  16. maxActive: 20
  17. initial-size: 3
  18. min-idle: 3
  19. max-active: 10
  20. max-wait: 60000
  21. two:
  22. username: root
  23. password: 123456
  24. driver-class-name: com.mysql.cj.jdbc.Driver
  25. url: jdbc:mysql://localhost:3306/layui?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  26. initialSize: 5
  27. minIdle: 5
  28. maxActive: 20
  29. initial-size: 6
  30. min-idle: 6
  31. max-active: 20
  32. max-wait: 12000
  33. stat-view-servlet:
  34. login-username: admin
  35. login-password: admin
  36. filter:
  37. stat:
  38. log-slow-sql: true
  39. slow-sql-millis: 2000
  40. mybatis:
  41. mapper-locations: classpath:mappers///Mapper.xml
  42. type-aliases-package: com.ccsert.spdruid..model
  43. configuration:
  44. map-underscore-to-camel-case: true
  45. logging:
  46. file: logs/mass.log
  47. level:
  48. org.springframework: info
  49. com.ccsert: DEBUG

着是完整的配置

主要在druid数据源和mybatis的mapper.xml进行了细微修改

这里我建立一个layui数据库,里面有个和demo里一样的表,数据和结构都一样,方便等会测试

包结构调整,代码修改

包结构调整

我们先把mapper接口修改一下

在原来的mapper包下建立两个包,一个one,一个two

然后把之前的mapper接口分别复制到one和two下

然后改一下名字

改完以后大概就是这个样子

代码修改

把之前的mapper注解都去掉

后面会用别的方法去映射

这是oneMapper

  1. package com.ccsert.spdruid.test.mapper.one;
  2. import com.ccsert.spdruid.test.model.TestUser;
  3. import java.util.List;
  4. public interface TestUserOneMapper {
  5. List<TestUser> getall();
  6. TestUser getById(Integer id);
  7. int save(TestUser testUser);
  8. }

这是twoMapper

  1. package com.ccsert.spdruid.test.mapper.two;
  2. import com.ccsert.spdruid.test.model.TestUser;
  3. public interface TestUserTwoMapper {
  4. TestUser getById(Integer id);
  5. }

这里为了方便我就只写一个接口

然后我们在修改一下service实现类

  1. package com.ccsert.spdruid.test.service.impl;
  2. import com.ccsert.spdruid.test.mapper.one.TestUserOneMapper;
  3. import com.ccsert.spdruid.test.mapper.two.TestUserTwoMapper;
  4. import com.ccsert.spdruid.test.model.TestUser;
  5. import com.ccsert.spdruid.test.service.TestUserService;
  6. import org.springframework.stereotype.Service;
  7. import javax.annotation.Resource;
  8. import java.util.List;
  9. @Service
  10. public class TestUserServiceImpl implements TestUserService {
  11. @Resource
  12. private TestUserOneMapper testUserOneMapper;
  13. @Resource
  14. private TestUserTwoMapper testUserTwoMapper;
  15. @Override
  16. public List<TestUser> getall() {
  17. return testUserOneMapper.getall();
  18. }
  19. @Override
  20. public TestUser getById(Integer id) {
  21. return testUserTwoMapper.getById(id);
  22. }
  23. @Override
  24. public int save(TestUser testUser) {
  25. return testUserOneMapper.save(testUser);
  26. }
  27. }

getById方法让他去调用twoMapper

其余的还是让它去调用原来的接口

配置文件修改

然后我们把xml的位置移动一下

在resources下的mappers下在建立两个文件夹

一个one

一个two

然后在把之前的TestUser目录复制两份到one和two下

把原来的TestUser删除掉

在把之前的xml名字修改一下

改完以后大概就是这个样子了



onemapper.xml的内容保持不变

主要写一下twomapper.xml的save保存方法

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.ccsert.spdruid.test.mapper.two.TestUserTwoMapper" >
  4. <resultMap id="BaseResultMap" type="com.ccsert.spdruid.test.model.TestUser" >
  5. <id column="id" property="Id" />
  6. <result column="user_name" property="userName"/>
  7. <result column="password" property="password" />
  8. </resultMap>
  9. <select id="getById" parameterType="Integer" resultMap="BaseResultMap">
  10. SELECT
  11. id,user_name,password
  12. FROM
  13. test_user
  14. WHERE id=#{id}
  15. </select>
  16. </mapper>

因为这里的mapper接口路径是修改过的,onemapper.xml要注意一下

多数据源配置

准备工作做好了接着就是配置多数据源了

在test包下建立一个config包,用于存放配置

然后在config包下建立一个MultiDataSourceConfig类

  1. package com.ccsert.spdruid.test.config;
  2. import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.context.annotation.Primary;
  7. import javax.sql.DataSource;
  8. @Configuration
  9. public class MultiDataSourceConfig {
  10. @Primary
  11. @Bean(name = "oneDataSource")
  12. @ConfigurationProperties("spring.datasource.druid.one")
  13. public DataSource dataSourceOne(){
  14. return DruidDataSourceBuilder.create().build();
  15. }
  16. @Bean(name = "twoDataSource")
  17. @ConfigurationProperties("spring.datasource.druid.two")
  18. public DataSource dataSourceTwo(){
  19. return DruidDataSourceBuilder.create().build();
  20. }
  21. }

这里的ConfigurationProperties是获取的yml或者properties里的值

spring.datasource.druid.one和spring.datasource.druid.two就是我们配置的数据源

Primary只能指定一个为默认数据源,这里指定了one数据库

在config下建立DataSource1Config类,用于配置数据源one

  1. package com.ccsert.spdruid.test.config;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.mybatis.spring.SqlSessionFactoryBean;
  4. import org.mybatis.spring.SqlSessionTemplate;
  5. import org.mybatis.spring.annotation.MapperScan;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.boot.context.properties.ConfigurationProperties;
  8. import org.springframework.boot.jdbc.DataSourceBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  14. import javax.sql.DataSource;
  15. @Configuration
  16. @MapperScan(basePackages = "com.ccsert.spdruid.test.mapper.one", sqlSessionTemplateRef = "test1SqlSessionTemplate")
  17. public class DataSource1Config {
  18. @Bean(name = "test1SqlSessionFactory")
  19. @Primary
  20. public SqlSessionFactory testSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
  21. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  22. bean.setDataSource(dataSource);
  23. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/one/**/*Mapper.xml"));
  24. return bean.getObject();
  25. }
  26. @Bean(name = "test1TransactionManager")
  27. @Primary
  28. public DataSourceTransactionManager testTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {
  29. return new DataSourceTransactionManager(dataSource);
  30. }
  31. @Bean(name = "test1SqlSessionTemplate")
  32. @Primary
  33. public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  34. return new SqlSessionTemplate(sqlSessionFactory);
  35. }
  36. }

@MapperScan(basePackages = "com.ccsert.spdruid.test.mapper.one", sqlSessionTemplateRef = "test1SqlSessionTemplate")指定了实体类的路径,这里就完成了映射,所以不需要在mapper接口上写@Mapper注解

然后在建立一个DataSource2Config类

内容和上面的差不多

  1. package com.ccsert.spdruid.test.config;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.mybatis.spring.SqlSessionFactoryBean;
  4. import org.mybatis.spring.SqlSessionTemplate;
  5. import org.mybatis.spring.annotation.MapperScan;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  10. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  11. import javax.sql.DataSource;
  12. @Configuration
  13. @MapperScan(basePackages = "com.ccsert.spdruid.test.mapper.two", sqlSessionTemplateRef = "test2SqlSessionTemplate")
  14. public class DataSource2Config {
  15. @Bean(name = "test2SqlSessionFactory")
  16. public SqlSessionFactory testSqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception {
  17. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  18. bean.setDataSource(dataSource);
  19. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/two/**/*Mapper.xml"));
  20. return bean.getObject();
  21. }
  22. @Bean(name = "test2TransactionManager")
  23. public DataSourceTransactionManager testTransactionManager(@Qualifier("twoDataSource") DataSource dataSource) {
  24. return new DataSourceTransactionManager(dataSource);
  25. }
  26. @Bean(name = "test2SqlSessionTemplate")
  27. public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  28. return new SqlSessionTemplate(sqlSessionFactory);
  29. }
  30. }

注意这两个路径写成自己的不要搞错了

到这里就配置完成了

测试使用

我们先访问一下接口能否调通

启动项目然后使用谷歌插件访问接口



可以看到我们两个接口都调用成功

我们去druid的监控界面查看一下执行的sql和数据源信息







可以看到druid监控了我们执行的两条sql,以及两个数据源信息

Mybatis+Druid多数据源配置的更多相关文章

  1. spring boot +mybatis+druid 多数据源配置

    因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...

  2. Druid动态数据源配置

    上文已经讲了单个数据源的Druid的配置(http://www.cnblogs.com/nbfujx/p/7686634.html) Druid动态数据源配置 主要是继承AbstractRouting ...

  3. (七)spring+druid多数据源配置

    druid多数据源配置 一.druid简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. ...

  4. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  5. Spring Druid多数据源配置

    SpringBoot 多数据源配置 如果需要在一个应用中使用多个数据源,应当如何实现呢,在Spring配置MyBatis中,我们可以看到以下的代码 <!-- mybatis 的SqlSessio ...

  6. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    前两天,我们已经介绍了关于JdbcTemplate的多数据源配置以及Spring Data JPA的多数据源配置,接下来具体说说使用MyBatis时候的多数据源场景该如何配置. 添加多数据源的配置 先 ...

  7. Springboot+Druid 动态数据源配置监控

    一.引入maven依赖,使用 starter 与原生 druid 依赖配置有所不同 <dependency> <groupId>com.alibaba</groupId& ...

  8. spring mybatis 多个数据源配置

    mybatis生成器:http://blog.csdn.net/tolcf/article/details/50835165 通过命令生成:java -jar mybatis-generator-co ...

  9. 记录一下自己搭建springboot+mybatis+druid 多数据源的过程

    前言  上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...

随机推荐

  1. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  2. SAP_BASIS常用事务代码

    1.SM66:监控当前系统的所有进程: 2.SM50/SM51:监视当前客户端的所有进程: 3.AL08:查看系统当前用户登录情况: 4.ST22:查看系统发生的DUMP: 5.ST03:查看系统当前 ...

  3. 计算机网络(1): http原理和uuid

    http 的请求报文和响应报文格式 请求报文有哪些方法 一个典型的http报文 状态码有哪几种 以及短语是用来解释状态码的 接口测试中,需要使用到UUID,用来生成唯一ID. 1.什么是UUID UU ...

  4. 学生选课系统(Java语言期末前测试)

      测试具体要求: 2.系统要求与功能设计 2.1 页面要求 (1)能够在Tomcat服务器中正确部署,并通过浏览器查看: (2)网站页面整体风格统一: (3)首页(登录页)要求实现不同用户登录后,进 ...

  5. JVM探秘:jstat查看JVM统计信息

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. jstat命令用来查看JVM统计信息,可以查看类加载信息.垃圾收集的信息.JIT编译信 ...

  6. java笔记-手写

  7. 洛谷 P1113 杂务(vector)

    题目传送门 解题思路: 本题说有些杂务是有前提条件的,而有一个特性就是某个杂务的前提一定在这个杂务前面输入,那么,这个题就瞬间沦为了黄题.对于那些有前提条件的杂务,我们只需要找它的前提条件中最晚完成的 ...

  8. 18 11 11 网络通信大都数使用的方式 socket

    ---恢复内容开始--- 浏览器  和 聊天工具  一般都用socket socket  在不同的  语言中的使用流程都大同小异    收  发  关闭 import socket def len() ...

  9. 从定时器的选型,到透过源码看XXL-Job(上)

    此内容来自一位好朋友的分享,也是当初建议我写博客提升的朋友.内容只做转载,未做修改. 定时任务选型 背景 目前项目定时任务采用Spring Task实现,随着项目需求的迭代,新增的定时任务也越来越多. ...

  10. 禁止网站F12和查看源码

    window.onload=function(){ document.onkeydown=function(){ var e=window.event||arguments[0]; if(e.keyC ...