自学内容网 自学内容网

SpringBoot使用SqlSessionFactory方式配置多数据源

场景:

一个项目操作多个数据库

解决方法:

通过SqlSessionFactory指定的数据源来操作指定目录的XML文件

实现:

1.项目结构:
在这里插入图片描述
2.pom文件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--    SpringBoot集成mybatis plus框架 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--常用工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>

3.配置yml文件

server:
  port: 9099

spring:
  application:
    name: kingdee-data
  datasource:
    kingdee-middle:
      driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      jdbc-url: jdbc:sqlserver://localhost:1433;databaseName=kingdee;Persist Security Info=True;Connection Timeout=30
      username: root
      password: root
    gfy:
      driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      jdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy;Persist Security Info=True;Connection Timeout=30
      username: root
      password: root
    gfy-002:
      driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      jdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy-002;Persist Security Info=True;Connection Timeout=30
      username: root
      password: root
    gfy-005:
      driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      jdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy-005;Persist Security Info=True;Connection Timeout=30
      username: root
      password: root

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  type-aliases-package: com.sys.kingdeedata.*
  configuration:
    #开启驼峰映射
    map-underscore-to-camel-case: false
    call-setters-on-nulls: true
    #开启复杂映射
    auto-mapping-behavior: full
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
    cache-enabled: true
    use-generated-keys: true
    default-executor-type: simple

    #配置全局默认主键类型,实体类就不用加 @TableId(value = "id", type = IdType.AUTO)
    global-config:
      db-config:
        id-type: auto

4.创键读取第一个数据库配置文件配置类并设置为主配置类

package com.sys.kingdeedata.common.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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 org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.sys.kingdeedata.mapper.gfy"}, sqlSessionFactoryRef = "gfySqlSessionFactory")
public class GfyMybatisConfig {

    @Bean(name = "gfyDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.gfy")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 配置事务管理器,不然事务不起作用
     *
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(this.dataSource());
    }

    @Primary
    @Bean(name = "gfySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("gfyDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/gfy/*.xml"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.sys.kingdeedata.entity");
        sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sqlSessionFactoryBean.getObject();
    }
}

5.有几个数据源就依次创建几个配置类

package com.sys.kingdeedata.common.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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 org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.sys.kingdeedata.mapper.gfy002"}, sqlSessionFactoryRef = "gfy002SqlSessionFactory")
public class Gfy002MybatisConfig {

    @Bean(name = "gfy002DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.gfy002")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 配置事务管理器,不然事务不起作用
     *
     * @return
     */
//    @Bean
//    public PlatformTransactionManager transactionManager() {
//        return new DataSourceTransactionManager(this.dataSource());
//    }

    @Bean(name = "gfy002SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("gfy002DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/gfy002/*.xml"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.sys.kingdeedata.entity");
        sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sqlSessionFactoryBean.getObject();
    }
}

6.在mapper包下按照配置创建对应的包,针对Mapper层通过SqlSessionFactory指定数据源来操作。


原文地址:https://blog.csdn.net/weixin_45618937/article/details/143056093

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!