总括:
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实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...
接下来,我们将详细讨论如何在Spring Boot中配置多个数据源。 首先,我们需要理解数据源的概念。数据源(DataSource)是Java中用于存储和管理数据库连接的接口,它允许应用程序与数据库进行交互。在Spring Boot中,...
### Spring Boot多数据源配置详解 #### 一、引言 在实际的软件开发过程中,随着业务需求的多样化,单一的数据源已经无法满足所有场景的需求。例如,有时我们需要同时访问两个或更多的数据库来完成复杂的业务逻辑,...
一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密(可自定义) ENC()。支持每个数据库独立初始化表结构schema和...
- **数据源配置类**:在Spring Boot的配置类中,使用@Configuration注解标记,定义多个数据源的@Bean。使用@ConfigurationProperties注解来绑定配置文件中的属性到数据源的Bean中,这样数据源的配置就可以从外部配置...
接下来,我们需要创建多个数据源配置。在SpringBoot中,我们可以使用`@ConfigurationProperties`注解将YAML或properties配置文件中的属性映射到Java对象上。例如,创建两个数据源配置类`PrimaryDataSourceConfig`和`...
SpringBoot 微服务框架整合配置及应用中,多数据源依赖是指在同一个应用程序中使用多个数据源,以满足不同的业务需求。在本文中,我们将介绍如何在 SpringBoot 中使用多数据源框架,包括配置、依赖和应用。 首先,...
对于多数据源,我们需要创建多个数据源配置,例如: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db username: root password: password driver-class-name: ...
springboot+mybatis的整合,配置多数据源多数据库连接。里边先进行了mysql+mysql的库2个数据源连接,后边又加了oracle 的库进行连接,总共3个连接,后续所有的库连接都一样,照模子套就可以!
相信很多朋友在开发的时候,可能会碰到需要一个项目,配置多个数据源的需求,可能是同一种数据库,也可能是不同种类的数据库,这种情况,我们就需要配置多数据源对程序的支持了。 本项目就是一个多数据源的配置,...
1. **配置文件**:首先,你需要在`application.properties`或`application.yml`中定义多个数据源。每个数据源都有自己的URL、用户名、密码以及驱动类名。例如: ```properties # 数据源1 spring.datasource1.url...
本项目结合了SpringBoot、Gradle和MyBatis,旨在实现多数据源的动态配置,这对于处理多个数据库或者分库分表的场景尤其有用。以下是对这个项目的详细解析: **SpringBoot** SpringBoot是由Pivotal团队提供的全新...
springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...
1. **配置数据源**:在`application.properties`或`application.yml`文件中,为每个数据源定义相应的属性,如URL、用户名、密码和驱动类名。 2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的...
在现代企业级应用开发中,随着业务规模的扩大和数据量的增长,往往需要处理来自多个数据源的数据。SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作...
你需要为每个数据源配置一个事务管理器,并确保在事务开始时选择正确的数据源。 6. **测试与实践**: 为了验证多数据源的配置是否正确,可以编写单元测试或集成测试,模拟对两个数据源的增删改查操作,确保数据被...
你需要为每个数据源创建一个数据源配置,例如`primary.datasource`和`secondary.datasource`,包括数据库驱动类、URL、用户名和密码等。 - **DataSource Bean**:通过`@ConfigurationProperties`注解,将配置文件中...
2. 配置数据源:创建多个DataSource Bean,每个Bean对应一个数据库连接配置,如URL、用户名、密码等。 3. 注解配置:使用`@Configuration`、`@EnableJpaRepositories`、`@EntityScan`等注解,分别指定数据源、仓库...
总结,Spring Boot结合MyBatis进行多数据源配置,主要通过创建多个数据源bean、SqlSessionFactoryBean、MapperScannerConfigurer以及SqlSessionTemplate来实现。通过注解和包扫描,我们可以方便地管理和使用多个数据...