Mybatis+Druid多数据源配置

在日常开发中我们可能会用到多数据源开发,什么是多数据源?
简单来讲的话,就是一个项目连接多个数据库。当然只是可能会用到,我暂时没见过应用场景,但是还是了解学习一下
此项目可以基于上一个简单集成项目进行简单的修改,就能实现多数据源了。

application.yml配置

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

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      one:
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        initialSize: 5
        minIdle: 5
        maxActive: 20
        initial-size: 3
        min-idle: 3
        max-active: 10
        max-wait: 60000
      two:
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/layui?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        initialSize: 5
        minIdle: 5
        maxActive: 20
        initial-size: 6
        min-idle: 6
        max-active: 20
        max-wait: 12000
      stat-view-servlet:
        login-username: admin
        login-password: admin
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 2000
mybatis:
  mapper-locations: classpath:mappers///Mapper.xml
  type-aliases-package: com.ccsert.spdruid..model
  configuration:
    map-underscore-to-camel-case: true

logging:
  file: logs/mass.log
  level:
    org.springframework: info
    com.ccsert: DEBUG

着是完整的配置
主要在druid数据源和mybatis的mapper.xml进行了细微修改
这里我建立一个layui数据库,里面有个和demo里一样的表,数据和结构都一样,方便等会测试

包结构调整,代码修改

包结构调整

我们先把mapper接口修改一下
在原来的mapper包下建立两个包,一个one,一个two
然后把之前的mapper接口分别复制到one和two下
然后改一下名字
改完以后大概就是这个样子

代码修改

把之前的mapper注解都去掉
后面会用别的方法去映射
这是oneMapper

package com.ccsert.spdruid.test.mapper.one;

import com.ccsert.spdruid.test.model.TestUser;

import java.util.List;

public interface TestUserOneMapper {

    List<TestUser> getall();

    TestUser getById(Integer id);

    int save(TestUser testUser);

}

这是twoMapper

package com.ccsert.spdruid.test.mapper.two;

import com.ccsert.spdruid.test.model.TestUser;

public interface TestUserTwoMapper {
    TestUser getById(Integer id);
}

这里为了方便我就只写一个接口
然后我们在修改一下service实现类

package com.ccsert.spdruid.test.service.impl;

import com.ccsert.spdruid.test.mapper.one.TestUserOneMapper;
import com.ccsert.spdruid.test.mapper.two.TestUserTwoMapper;
import com.ccsert.spdruid.test.model.TestUser;
import com.ccsert.spdruid.test.service.TestUserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class TestUserServiceImpl implements TestUserService {
    @Resource
    private TestUserOneMapper testUserOneMapper;

    @Resource
    private TestUserTwoMapper testUserTwoMapper;
    @Override
    public List<TestUser> getall() {
        return testUserOneMapper.getall();
    }

    @Override
    public TestUser getById(Integer id) {
        return testUserTwoMapper.getById(id);
    }

    @Override
    public int save(TestUser testUser) {
        return testUserOneMapper.save(testUser);
    }

}

getById方法让他去调用twoMapper
其余的还是让它去调用原来的接口

配置文件修改

然后我们把xml的位置移动一下
在resources下的mappers下在建立两个文件夹
一个one
一个two
然后在把之前的TestUser目录复制两份到one和two下
把原来的TestUser删除掉
在把之前的xml名字修改一下
改完以后大概就是这个样子了

onemapper.xml的内容保持不变
主要写一下twomapper.xml的save保存方法

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ccsert.spdruid.test.mapper.two.TestUserTwoMapper" >
    <resultMap id="BaseResultMap" type="com.ccsert.spdruid.test.model.TestUser" >
        <id column="id" property="Id"  />
        <result column="user_name" property="userName"/>
        <result column="password" property="password" />
    </resultMap>

    <select id="getById" parameterType="Integer"  resultMap="BaseResultMap">
     SELECT
        id,user_name,password
    FROM
        test_user
    WHERE id=#{id}
    </select>

</mapper>

因为这里的mapper接口路径是修改过的,onemapper.xml要注意一下
多数据源配置
准备工作做好了接着就是配置多数据源了
在test包下建立一个config包,用于存放配置
然后在config包下建立一个MultiDataSourceConfig类

package com.ccsert.spdruid.test.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class MultiDataSourceConfig {
    @Primary
    @Bean(name = "oneDataSource")
    @ConfigurationProperties("spring.datasource.druid.one")
    public DataSource dataSourceOne(){
        return DruidDataSourceBuilder.create().build();
    }
    @Bean(name = "twoDataSource")
    @ConfigurationProperties("spring.datasource.druid.two")
    public DataSource dataSourceTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

这里的ConfigurationProperties是获取的yml或者properties里的值
spring.datasource.druid.one和spring.datasource.druid.two就是我们配置的数据源
Primary只能指定一个为默认数据源,这里指定了one数据库
在config下建立DataSource1Config类,用于配置数据源one

package com.ccsert.spdruid.test.config;

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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.ccsert.spdruid.test.mapper.one", sqlSessionTemplateRef  = "test1SqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/one/**/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean(name = "test1TransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

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

然后在建立一个DataSource2Config类

内容和上面的差不多

package com.ccsert.spdruid.test.config;

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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.ccsert.spdruid.test.mapper.two", sqlSessionTemplateRef  = "test2SqlSessionTemplate")
public class DataSource2Config {

    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/two/**/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("twoDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

注意这两个路径写成自己的不要搞错了
到这里就配置完成了
测试使用
我们先访问一下接口能否调通
启动项目然后使用谷歌插件访问接口

可以看到我们两个接口都调用成功
我们去druid的监控界面查看一下执行的sql和数据源信息



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

原文地址:https://www.cnblogs.com/ccsert/p/12249252.html

时间: 2024-11-07 20:15:22

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

springboot druid 多数据源配置

由于工作当中,需要配置双数据源进行数据同步,以目录进行区别主副库的编写.这里记录一下,方便大家. 1.pom配置 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid-spring-boot-starter.version}</version></d

spring,mybatis,多数据源配置

spring.xml配置 <!-- 对数据源进行事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="multipleDataSource"></pr

基于 Spring + Atomikos + Mybatis的多数据源配置demo

1.spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.

mybatis pagehelper多数据源配置的坑

我用spring boot配置了2个数据源的工程用来同步不同库的数据,发现如果配置成如下格式报错 #分页配置pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: count=countSql 报错内容为: org.springframework.beans.factory.BeanCreationException: Error creating bean with n

springboot+mybatis+Druid配置多数据源(mysql+postgre)

springboot+mybatis+Druid配置多数据源(mysql+postgre)引入pom依赖设置application多数据源config配置db1config配置(主数据库配置)db2config配置(其他数据库)事务处理mapper层 springboot+mybatis+Druid配置多数据源(mysql+postgre) 参考资料: 第八章 springboot + mybatis + 多数据源 springboot + mybatis + druid + 多数据源 spri

Springboot 2.x下多数据源配置

本文同样适用于2.x版本下Mybatis的多数据源配置 项目中经常会遇到一个项目需要访问多个数据源的情况,多数情况下可以参考这个教程进行配置. 不过该教程适合springboot1.x版本,由于2.x版本修改默认连接池为Hikari,所以该教程中的配置需要进行一些修改才可适用于2.x. 主要不同之处在于DataSource的初始化. 所以可在每个数据源的config中,重新定义DataSource-Bean的初始化方式. @Bean @Primary @ConfigurationProperti

SpringBoot2 + Druid + Mybatis 多数据源配置

在大数据高并发的应用场景下,为了更快的响应用户请求,读写分离是比较常见的应对方案.读写分离会使用多数据源的使用.下面记录如何搭建SpringBoot2 + Druid + Mybatis  多数据源配置以及在使用过程遇到的问题. 一.先从pom.xml入手(使用springboot 2的版本) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

springboot+druid+mybatis plus的多数据源配置

思路 yml中配置多个数据源信息 通过AOP切换不同数据源 配合mybatis plus使用 POM依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- AOP依赖 --> <dependency> <groupI

项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库

作者:泥沙砖瓦浆木匠 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 如果我的帮到了你,是否乐意捐助一下或请一杯啤酒也好呢?有你支持,干的更好~ 点这参与众筹 我的支付宝:13958686678 一. 前言 泥瓦匠又和大家见面了,最近两天我在Code Review ,顺便代码小小的Refactoring(重构)下.先了解这个项目吧,这次解决的是数据源配置优化.因为这web项目中配置数据源的地方很多.例如JDBC要配置数据源,Mybatis要配置数据源,Quartz定时任务要配