`
y806839048
  • 浏览: 1126228 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

springboot多个个数据源配置

阅读更多

总括:

springboot两个数据源配置

1,用注解或配置文件的方式排除自动配置---否则出现一个数据源的mapper接口找不到

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

2,分别配置数据源,并指定一个主数据源 @Primary---否则出现java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

可能出现mysql,oralce 只当mysql为主数据源有问题,指定oracle是主数据源就好了

  可能是两个数据源不是同时生成????

 

 

Main.run(Main.class, args);

在springboot中前面的是spring启动类,后面的参数类主要用其中的注解

 

示例:

 

说起多 数据 源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务, 配置 多数据源重点是配置文件,所以 数据库 ,pox文件,实体类我都不发出来了,自己创建两个数据库,配置实体类就行了

版权声明:本文由 低调小熊猫 发表于 低调小熊猫的 博客

转载声明:自由转载-非商用-非衍生-保持署名,非商业转载请注明作者及出处,商业转载请联系作者本人qq:2696284032

文章 链接: https ://aodeng.cc/archives/ springboot -san


排除自动配置

spring boot会自动读取配置文件,由于我们需要配置多数据源,所以要排除自动配置,在启动入口添加如下注解

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})


配置数据源

在application.yml中配置两个数据源

spring:
  datasource:
    first:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: XXX
      password: XXX
      type: com.alibaba.druid.pool.DruidDataSource
      initial-size: 1
      minIdle: 3
      maxActive: 20
      maxWait: 60000
      filters: stat,wall,slf4j
    second:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: XXX
      password: XXX
      type: com.alibaba.druid.pool.DruidDataSource


创建配置文件封装类

@ConfigurationProperties
注解指定数据来源

1.FirstDataProperties类

package com.ad.core.hope.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @program:hope
 * @author:aodeng
 * @create:2018-08-31 13:46
 **/
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.first")
public class FirstDataProperties {
    String driverClassName;
    String url;
    String username;
    String password;
}

2.SecondDataProperties类

package com.ad.core.hope.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @program:hope
 * @author:aodeng
 * @create:2018-08-31 13:47
 **/
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.second")
public class SecondDataProperties {
    String driverClassName;
    String url;
    String username;
    String password;
}


数据源配置

这里面的 代码 才是最重要的

注: @Primary
必须使用该注解指定主数据源

@MapperScan
指定路径下的 mapper 使用该数据源

1.FirstDataSourceConfig配置

package com.ad.core.hope.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.Autowired;
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;

/**
 * @program:hope
 * @author:aodeng
 * @create:2018-08-02 20:16
 **/

@Configuration
@MapperScan(basePackages = "com.ad.core.hope.mapper.first",sqlSessionTemplateRef = "firstSqlSessionTemplate")
public class FirstDataSourceConfig {

    @Autowired
    private FirstDataProperties firstprop;

    //创建数据源
    @Bean(name="firstDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.first")

    public DataSource getFirstDataSource(){
        DataSource build = DataSourceBuilder.create()
                .driverClassName(firstprop.driverClassName)
                .url(firstprop.url)
                .username(firstprop.username)
                .password(firstprop.password).build();
     return build;
    }

    //创建SqlSessionFactory
    @Bean(name = "firstSqlSessionFactory")

    public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception{
     SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
     bean.setDataSource(dataSource);
     return bean.getObject();
    }

    //创建事务管理器
    @Bean(name = "firstTransactionManager")

    public DataSourceTransactionManager firstTransactionManager(@Qualifier("firstDataSource") DataSource dataSource){
     return new DataSourceTransactionManager(dataSource);
    }

    //创建SqlSessionTemplate
    @Bean(name = "firstSqlSessionTemplate")

    public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws  Exception{
     return new SqlSessionTemplate(sqlSessionFactory);
    }

    private Class getType(String type){
        try {
            return Class.forName(type);
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        return null;
    }
}

2.SecondDataSourceConfig配置

package com.ad.core.hope.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.Autowired;
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;

/**
 * @program:hope
 * @author:aodeng
 * @create:2018-08-02 20:16
 **/

@Configuration
@MapperScan(basePackages = "com.ad.core.hope.mapper.second",sqlSessionTemplateRef = "secondSqlSessionTemplate")
public class SecondDataSourceConfig {

    @Autowired
    private SecondDataProperties secondprop;

    //创建数据源
    @Bean(name="secondDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    @Primary
    public DataSource getSecondDataSource(){
        DataSource build = DataSourceBuilder.create()
                .driverClassName(secondprop.driverClassName)
                .url(secondprop.url)
                .username(secondprop.username)
                .password(secondprop.password).build();
        return build;
    }

    //创建SqlSessionFactory
    @Bean(name = "secondSqlSessionFactory")
    @Primary
    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    //创建事务管理器
    @Bean(name = "secondTransactionManager")
    @Primary
    public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    //创建SqlSessionTemplate
    @Bean(name = "secondSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws  Exception{
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    private Class getType(String type){
        try {
            return Class.forName(type);
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        return null;
    }
}


实现Mapper

注:该mapper的路径必须和 @MapperScan
注解的指定路径一样

1.first路径下的mapepr

package com.ad.core.hope.mapper.first;

import com.ad.core.hope.enums.TestUserEnum;
import com.ad.core.hope.vo.base.TestVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface TestInterface {

    @Select("SELECT * FROM user")
    @Results({
            @Result(property = "sex", column = "sex", javaType = TestUserEnum.class),
            @Result(property = "name", column = "username")
    })
    List<TestVo> getAll();
}

2.second路径下的mapper

package com.ad.core.hope.mapper.second;

import com.ad.core.hope.model.admin.SysUser;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;

/**
 * @program:hope
 * @author:aodeng
 * @create:2018-09-02 17:25
 **/
@org.apache.ibatis.annotations.Mapper
public interface TestMapper{
    @Select("SELECT * FROM sys_user")
    @Results({
            @Result(property = "userid", column = "userId"),
            @Result(property = "username", column = "username")
    })
    List<SysUser> getAll();
}


Controller使用

使用 @Autowired
注解装配mapper使用

@Controller
public class TeseController {

    @Autowired
    private TestInterface testInterface;

    @Autowired
    private TestMapper testMapper;

    @RequestMapping("/login")
    public String login(Model model){
        //数据源first测试
        List<TestVo> list=testInterface.getAll();
        for(int i=0;i<list.size();i++){
            System.out.println("测试fisrt数据源"+list.get(i).getName());
        }
        //数据源second测试
        List<SysUser> user=testMapper.getAll();
        for(int i=0;i<user.size();i++){
            System.out.println("测试second数据源"+user.get(i).getUsername());
        }
        return "admin/system_login";
    }
}

 

 

 

参看:

http://ju.outofmemory.cn/entry/369541

 

分享到:
评论

相关推荐

    SpringBoot配置多数据源实现动态切换数据源

    总结来说,SpringBoot实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...

    springboot多数据源配置

    接下来,我们将详细讨论如何在Spring Boot中配置多个数据源。 首先,我们需要理解数据源的概念。数据源(DataSource)是Java中用于存储和管理数据库连接的接口,它允许应用程序与数据库进行交互。在Spring Boot中,...

    SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置).docx

    ### Spring Boot多数据源配置详解 #### 一、引言 在实际的软件开发过程中,随着业务需求的多样化,单一的数据源已经无法满足所有场景的需求。例如,有时我们需要同时访问两个或更多的数据库来完成复杂的业务逻辑,...

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务

    一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密(可自定义) ENC()。支持每个数据库独立初始化表结构schema和...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    - **数据源配置类**:在Spring Boot的配置类中,使用@Configuration注解标记,定义多个数据源的@Bean。使用@ConfigurationProperties注解来绑定配置文件中的属性到数据源的Bean中,这样数据源的配置就可以从外部配置...

    SpringBoot+druid+多数据源示例

    接下来,我们需要创建多个数据源配置。在SpringBoot中,我们可以使用`@ConfigurationProperties`注解将YAML或properties配置文件中的属性映射到Java对象上。例如,创建两个数据源配置类`PrimaryDataSourceConfig`和`...

    SpringBoot多数据源框架【整合配置及应用】.docx

    SpringBoot 微服务框架整合配置及应用中,多数据源依赖是指在同一个应用程序中使用多个数据源,以满足不同的业务需求。在本文中,我们将介绍如何在 SpringBoot 中使用多数据源框架,包括配置、依赖和应用。 首先,...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    对于多数据源,我们需要创建多个数据源配置,例如: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db username: root password: password driver-class-name: ...

    springboot+mybatis配置多数据源,mysql+mysql+oracle

    springboot+mybatis的整合,配置多数据源多数据库连接。里边先进行了mysql+mysql的库2个数据源连接,后边又加了oracle 的库进行连接,总共3个连接,后续所有的库连接都一样,照模子套就可以!

    springboot2+mybatis多数据源配置

    相信很多朋友在开发的时候,可能会碰到需要一个项目,配置多个数据源的需求,可能是同一种数据库,也可能是不同种类的数据库,这种情况,我们就需要配置多数据源对程序的支持了。 本项目就是一个多数据源的配置,...

    springboot-mybatis-多数据源

    1. **配置文件**:首先,你需要在`application.properties`或`application.yml`中定义多个数据源。每个数据源都有自己的URL、用户名、密码以及驱动类名。例如: ```properties # 数据源1 spring.datasource1.url...

    SpringBoot+gradle+mybatis多数据源动态配置

    本项目结合了SpringBoot、Gradle和MyBatis,旨在实现多数据源的动态配置,这对于处理多个数据库或者分库分表的场景尤其有用。以下是对这个项目的详细解析: **SpringBoot** SpringBoot是由Pivotal团队提供的全新...

    springboot+mybatis多数据源+动态数据源配置(连接池)

    springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    1. **配置数据源**:在`application.properties`或`application.yml`文件中,为每个数据源定义相应的属性,如URL、用户名、密码和驱动类名。 2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的...

    springboot多数据源即分布式事务解决方案

    在现代企业级应用开发中,随着业务规模的扩大和数据量的增长,往往需要处理来自多个数据源的数据。SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作...

    SpringBoot多数据源案例

    你需要为每个数据源配置一个事务管理器,并确保在事务开始时选择正确的数据源。 6. **测试与实践**: 为了验证多数据源的配置是否正确,可以编写单元测试或集成测试,模拟对两个数据源的增删改查操作,确保数据被...

    springboot + mybatis 多数据源demo

    你需要为每个数据源创建一个数据源配置,例如`primary.datasource`和`secondary.datasource`,包括数据库驱动类、URL、用户名和密码等。 - **DataSource Bean**:通过`@ConfigurationProperties`注解,将配置文件中...

    Springboot 动态多数据源 jta分布式事务

    2. 配置数据源:创建多个DataSource Bean,每个Bean对应一个数据库连接配置,如URL、用户名、密码等。 3. 注解配置:使用`@Configuration`、`@EnableJpaRepositories`、`@EntityScan`等注解,分别指定数据源、仓库...

    springboot-mybatis整合多数据源方式之一配置法

    总结,Spring Boot结合MyBatis进行多数据源配置,主要通过创建多个数据源bean、SqlSessionFactoryBean、MapperScannerConfigurer以及SqlSessionTemplate来实现。通过注解和包扫描,我们可以方便地管理和使用多个数据...

Global site tag (gtag.js) - Google Analytics