Spring - 配置支持多数据源

SpringBoot整合多数据源

在SpringBoot工程中整合多数据源,和在SSM工程中整合稍微有一点区别。

整合步骤

具体整合步骤如下:

1、在application.properties中配置出多个数据源
spring.datasource.test1.jdbc-url=jdbc:mysql://yourmysqlurl/yourdb
spring.datasource.test1.username=yourusername
spring.datasource.test1.password=yourpassword
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:sqlserver://yoursqlserverurl;database=yourdb;
spring.datasource.test2.username=yourusername
spring.datasource.test2.password=yourpassword
spring.datasource.test2.driver.class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
2、在代码中创建出mapper目录,在mapper目录下创建出不同数据源的目录
创建出目录

在这里插入图片描述

MySQL数据源的Mapper
			@Repository
			public interface MUserTableMapper {
    			  public User getOneByMySQLId(Integer id);
			}
SQL Server数据源的Mapper
		@Repository
		public interface UserTableMapper {
		    public User getOneBySQLServerId(Integer id);
		}
3、创建config package目录,在config目录下创建出两个数据源的配置类
创建出目录

在这里插入图片描述

MySqlConfig
package com.test.multipledatasource.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.test.multipledatasource.mapper.mysql",sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class DataSourceMysqlConfig {
    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource test1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "mysqlTransactionMananger")
    @Primary
    public DataSourceTransactionManager test2TransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
//        sqlsessionTemplate:接受sqlsessionfactory中的数据来创建sqlsession
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

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

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.test.multipledatasource.mapper.sqlserver",sqlSessionTemplateRef = "sqlserverSqlSessionTemplate")
public class DataSourceSqlServerConfig {

    //    @Bean:将方法生命成对象交个spring来管理。spring只引用一次该方法,然后就交由springIOC来管理
    @Bean(name="sqlserverDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
//    当一个类中有多个@Bean时,加@Primary注解的可以优先加载
    public DataSource test2DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlserverSqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactroy(@Qualifier("sqlserverDataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "sqlserverTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("sqlserverDataSource") DataSource dataSource) throws Exception{
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sqlserverSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlserverSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return  new SqlSessionTemplate(sqlSessionFactory);
    }
}

4、在Resource下生成Mapper.xml文件

在这里插入图片描述

MySQL Mapper xml
<?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.test.multipledatasource.mapper.mysql.MUserTableMapper">

    <select id="getOneByMySQLId" resultType="com.test.multipledatasource.bean.User">
        select * from user_info
        WHERE id=#{id} 
    </select>
</mapper>
SQL Server Mapper xml
<?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.test.multipledatasource.mapper.sqlserver.UserTableMapper">

    <select id="getOneBySQLServerId" resultType="com.test.multipledatasource.bean.User">
        select * from user_info
        WHERE id=#{id} 
    </select>
</mapper>

验证

创建实体类

@Data
@NoArgsConstructor
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@EqualsAndHashCode(callSuper = false)
public class User {
	private String name ;
	private String passwd;
	...
}

创建Controller,编写测试接口

@RestController
public class UserInfoController {

	//My SQL mapper
    @Autowired
    MUserTableMapper mUserTableMapper;
    //SQL Server mapper
    @Autowired
    UserTableMapper userTableMapper;


    @GetMapping("/v1/api/mysql/user")
    public Result<User> getMySQLUserById(@RequestParam Integer userid) {
        //mysql数据源
        User user = mUserTableMapper.getOneByMySQLId(userid);
        return getResult(200,"Success",user);
    }

    @GetMapping("/v1/api/sqlserver/user")
    public Result<User> getSQLServerUserById(@RequestParam Integer userid) {
        //sql server数据源
        User user = userTableMapper.getOneBySQLServerId(userid);
        return getResult(200,"Success",user);
    }
}

Postman接口测试

查看接口返回正确。

SSM整合多数据源

在SSM工程中整合多数据源,基本和Spring Boot工程一致,稍微有一点区别。在Config配置类中需要手动的指定DataSource的信息。否则会报错:Cause: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified

package com.test.config;

import com.zaxxer.hikari.HikariDataSource;
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.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.test.mapper.mysql",sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class DataSourceMysqlConfig {

    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource test1DataSource(){
        return DataSourceBuilder.create()
                .type(HikariDataSource.class)
                .driverClassName(properties.determineDriverClassName())
                .url(properties.determineUrl())
                .username(properties.determineUsername())
                .password(properties.determinePassword())
                .build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/test/mapper/mysql/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "mysqlTransactionMananger")
    @Primary
    public DataSourceTransactionManager test2TransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
//        sqlsessionTemplate:接受sqlsessionfactory中的数据来创建sqlsession
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatis-plus 可以通过在配置文件中配置多个数据源来实现多数据源支持。 1. 在 application.yml 或者 application.properties 中配置多个数据源,如: ``` spring: datasource: master: url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 2. 在 mybatis-plus 的配置类中,通过注解 @ConfigurationProperties(prefix = "spring.datasource.master") 来指定使用哪个数据源。 3. 在 Service 中通过注解 @DS("slave") 来指定使用从库, @DS("master") 来指定使用主库。 参考代码: ``` @Configuration @MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "slaveSqlSessionTemplate") @ConfigurationProperties(prefix = "spring.datasource.slave") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") public DataSource dataSource() { return new DruidDataSource(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } @Service @DS("slave") public class TestService { @Autowired private TestMapper testMapper; public List<Test> getAll() { return testMapper.selectList(null); } } ``` 需要注意的是,使用多数据源需要在项目中引入 mybatis-plus-extension 包,并且需要配置多数据源的事务管理器。 ### 回答2: Mybatis-plus是一个流行的Mybatis增强工具包,允许开发人员更容易地与数据库进行交互。在实际开发中,我们可能需要使用多个数据源来达到不同的业务需求。下面是配置Mybatis-plus多数据源的详细步骤。 1. 添加多数据源配置项 在application.yml中添加多个数据源配置,例如: ```yaml # 主数据源配置 spring.datasource.master.url=jdbc:mysql://localhost:3306/master spring.datasource.master.username=root spring.datasource.master.password=root # 从数据源配置 spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave spring.datasource.slave.username=root spring.datasource.slave.password=root ``` 2. 创建数据源对象 Mybatis-plus需要使用DruidDataSource数据源对象,因此需要创建多个数据源对象用于连接主从数据库。我们可以使用@Primary注解指定默认的数据源。 ```java @Configuration public class DataSourceConfig { @Primary @Bean @ConfigurationProperties("spring.datasource.master") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.slave") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } } ``` 3. 配置Mybatis-plus的SqlSessionFactory和SqlSessionTemplate 我们需要为每个数据源创建SqlSessionFactory和SqlSessionTemplate。Mybatis-plus提供了MybatisSqlSessionFactoryBean和MybatisSqlSessionTemplate两个类,用于创建Mybatis的SqlSessionFactory和SqlSessionTemplate对象。 ```java @Configuration @MapperScan(basePackages = {"com.example.mapper"}) public class MybatisConfig { @Primary @Bean public MybatisSqlSessionFactoryBean masterSqlSessionFactory( @Qualifier("masterDataSource") DataSource dataSource ) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean; } @Bean public MybatisSqlSessionTemplate masterSqlSessionTemplate( @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory ) { return new MybatisSqlSessionTemplate(sqlSessionFactory); } @Bean public MybatisSqlSessionFactoryBean slaveSqlSessionFactory( @Qualifier("slaveDataSource") DataSource dataSource ) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean; } @Bean public MybatisSqlSessionTemplate slaveSqlSessionTemplate( @Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory ) { return new MybatisSqlSessionTemplate(sqlSessionFactory); } } ``` 4. 创建多数据源的Mapper接口 我们需要为每个数据源创建一个Mapper接口,用于访问相应的数据库。可以使用@Mapper注解将Mapper接口注册到Spring容器中。同时,我们需要使用@Qualifier注解指定具体的SqlSessionTemplate来操作不同的数据库。 ```java @Mapper @Component public interface MasterMapper { @Select("SELECT count(*) FROM user") int countUser(); } @Mapper @Component public interface SlaveMapper { @Select("SELECT count(*) FROM book") int countBook(); } ``` 5. 测试使用多数据源 我们可以在业务代码中使用注入的Mapper来操作主从数据库,例如: ```java @Service public class TestService { @Autowired @Qualifier("masterSqlSessionTemplate") private SqlSessionTemplate masterSqlSessionTemplate; @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; public int countUser() { return masterSqlSessionTemplate.getMapper(MasterMapper.class).countUser(); } public int countBook() { return slaveSqlSessionTemplate.getMapper(SlaveMapper.class).countBook(); } } ``` 通过以上步骤,我们成功地配置了Mybatis-plus的多数据源。在实际开发中,如果需要使用更多的数据源,只需按照以上方法添加即可。 ### 回答3: Mybatis-plus是一个基于Mybatis的一款全面功能和增强功能的ORM框架,它可以简化Java开发人员在不同的数据库之间切换的过程。在Mybatis-plus中,我们可以很容易的配置多数据源,以满足应用中不同业务所需的数据源。 下面,我们来详细了解Mybatis-plus配置多数据源的步骤: 1. 导入依赖 在pom.xml文件中导入Mybatis-plus和对应的数据库驱动依赖,如下所示: ```xml <!-- Mybatis-plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus-version}</version> </dependency> <!-- MySQL驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 配置数据源 在application.properties文件中配置数据源,如下所示: ```properties ## 主数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=root spring.datasource.password=123456 ## 次数据源 spring.second.datasource.driver-class-name=com.mysql.jdbc.Driver spring.second.datasource.url=jdbc:mysql://localhost:3306/db2 spring.second.datasource.username=root spring.second.datasource.password=123456 ``` 3. 配置多数据源 在Mybatis-plus的配置文件中,我们通过定义多个数据源配置来实现多数据源的功能,如下所示: ```java @Configuration @MapperScan(basePackages = {"com.example.mapper1", "com.example.mapper2"}, sqlSessionTemplateRef = "sqlSessionTemplate") public class MybatisPlusConfig { @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDataSource") @ConfigurationProperties(prefix = "spring.second.datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "transactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "secondTransactionManager") public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } @Bean(name = "secondSqlSessionTemplate") public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 在上述代码中,我们定义了两个数据源dataSource和secondDataSource,并分别配置了两个SqlSessionFactory、两个DataSourceTransactionManager以及两个SqlSessionTemplate。通过这种方式,就可以在应用中轻松切换不同的数据源,以满足应用中不同业务的需求。 总之,Mybatis-plus提供了非常简单的方式来配置多数据源,具体实现过程如上所示。对于开发者来说,如果要实现多数据源的切换,除了了解上述配置方式之外,还需要记住在使用时如何切换数据源,一定要注意正确使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值