Java | MyBatis 配置多数据源

2021-05-13 15:50:31 浏览数 (1)

Mybatis 配置多数据源


Table of Contents

前言使用步骤1. 引入库2. 配置多数据源3. 配置


前言

在开发一些报表项目时,很容易涉及到从多个数据源获取数据,这里介绍一下如何给 Mybatis 在配置多数据源.

使用步骤

1. 引入库

正常引入 mybatis 依赖即可

2. 配置多数据源

代码语言:javascript复制
spring:
  datasource:
    report1:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://127.0.0.1:3306/report_1
      username: root
      password: 123456
    report2:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://127.0.0.1:3306/report_2
      username: root
      password: 123456

3. 配置

配置report1

代码语言:javascript复制
import com.github.pagehelper.PageInterceptor;
import java.util.Properties;
import javax.sql.DataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(basePackages = {
    "com.example.demo.mapper.report1"}, sqlSessionFactoryRef = "sqlSessionFactoryReport1")
public class ReportMybatisConfiguration {

  @Bean(name = "reportDB")
  @ConfigurationProperties(prefix = "spring.datasource.report1")
  public DataSource dataSource1() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  public SqlSessionFactory sqlSessionFactoryReport1() throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource1());

    PageInterceptor pageInterceptor = new PageInterceptor();
    Properties properties = new Properties();
    properties.setProperty("helperDialect", "mysql");
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("params", "count=countSql");
    pageInterceptor.setProperties(properties);
    factoryBean.setPlugins(pageInterceptor);

    return factoryBean.getObject();

  }

  @Bean
  public SqlSessionTemplate sqlSessionTemplateReport1() throws Exception {
    return new SqlSessionTemplate(sqlSessionFactoryReport1());
  }

}

配置report2

代码语言:javascript复制
import com.github.pagehelper.PageInterceptor;
import java.util.Properties;
import javax.sql.DataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(basePackages = {
    "com.example.demo.mapper.report2"}, sqlSessionFactoryRef = "sqlSessionFactoryReport2")
public class Report2MybatisConfiguration {

  @Bean(name = "report2DB")
  @ConfigurationProperties(prefix = "spring.datasource.report2")
  public DataSource dataSource2() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  public SqlSessionFactory sqlSessionFactoryReport2() throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource2());

    org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
    configuration.setMapUnderscoreToCamelCase(true);
    factoryBean.setConfiguration(configuration);

    PageInterceptor pageInterceptor = new PageInterceptor();
    Properties properties = new Properties();
    properties.setProperty("helperDialect", "mysql");
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("params", "count=countSql");
    pageInterceptor.setProperties(properties);
    factoryBean.setPlugins(pageInterceptor);

    return factoryBean.getObject();

  }

  @Bean
  public SqlSessionTemplate sqlSessionTemplateReport2() throws Exception {
    return new SqlSessionTemplate(sqlSessionFactoryReport2());
  }

}

这样我们就配置完了,在配置的过程中加入 PageInterceptor 分页插件,如果不需要可以删除 PageInterceptor 关联代码

这样配置后,在包 com.example.demo.mapper.report1 编写的 mapper 则使用 report1 库, 同理在 包 com.example.demo.mapper.report1 编写的 mapper 则使用 report2 库。

这样就完成了多数据源的配置,同理也可以配置更多的数据源

最近的时间不太多,接下来将写几篇关于日常工作中用到的一些技术以及如何与 Spring Boot 整合的文章,计划如下:

  1. 数据库表结构管理 flayway
  2. MyBatis 的整合使用
  3. Spring Data REST 快速构建一个 restful 项目
  4. 使用 Spring Integration 来配置分布式锁
  5. Sentinel 的单机使用和 Sentinel Dashboard 的搭建
  6. 使用 maven git commit 插件来生成打包版本号,方便线程排查
  7. 关于 Spring Boot 和 Spring Cloud 匹配版本的查看方法
  8. 如果快速将一个 Spring Boot 项目,改成Spring Cloud 项目
  9. 使用 Spring Boot Admin 来监控我们的 Spring Cloud 项目
  10. 风控规则集的开发实践

0 人点赞