美文网首页
Spring Boot3+Mybatis 集成2个Mysql数据

Spring Boot3+Mybatis 集成2个Mysql数据

作者: 狄仁杰666 | 来源:发表于2024-03-24 18:05 被阅读0次

前言

来啦老铁!

学习路径

  1. 修改项目启动类;
  2. 修改项目配置文件;
  3. 增加 MybatisConfig.java 配置文件;
  4. 调整项目目录结构;

1. 修改项目启动类;

  • 删除 @MapperScan 注解,例如单 mysql 时:
package priv.dylan.space;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"priv.dylan"})
@MapperScan(basePackages = "priv.dylan.space.mapper")
public class SpaceApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpaceApplication.class, args);
        System.out.println("Hello World~");
    }

}

改为:

package priv.dylan.space;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"priv.dylan"})
public class SpaceApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpaceApplication.class, args);
        System.out.println("Hello World~");
    }

}

2. 修改项目配置文件;

  • 找到项目配置文件:application.yml 或 application.propertities 文件;
  • spring 下的 datasource 节点改造为 2 个 mysql 的配置,如:
spring:
  application:
    name: utils
  datasource:
    primary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://127.0.0.1:3307/my_db?useSSL=false
      username: root
      password: root
    secondary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://xx.xxx.xxx.xx:3306/xx_xx?useSSL=false
      username: xxxxxx
      password: xxxxxx

注:
a. primary 和 secondary 是自己定义的,可以使用任意文本

b. 修改 mybatis 配置,删除 mapper-locations 和 type-aliases-package,如:

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: priv.dylan.space.entity
  ...

改为:

mybatis:  
  ...

3. 增加 MybatisConfig.java 配置文件;

  • 代码参考如下:
package priv.dylan.space.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
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 javax.sql.DataSource;

@Configuration
public class MybatisConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory firstSqlSessionFactory(DataSource firstDataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(firstDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/mydb/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionFactory secondSqlSessionFactory(DataSource secondDataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(secondDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/testdb/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public MapperScannerConfigurer firstMapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("firstSqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("priv.dylan.space.mapper.mydb");
        return mapperScannerConfigurer;
    }

    @Bean
    public MapperScannerConfigurer secondMapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("secondSqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("priv.dylan.space.mapper.testdb");
        return mapperScannerConfigurer;
    }
}

注:
a. @ConfigurationProperties(prefix = "spring.datasource.primary")
和 @ConfigurationProperties(prefix = "spring.datasource.secondary") 中的 primary 和 secondary 要与项目配置文件 application.yml 或 application.properities 文件中关于 mysql 数据的配置名一致;

b.为不同的 mapper 接口类配置不同的 SqlSessionFactory 这一点非常重要,如 firstMapperScannerConfigurer 方法和 secondMapperScannerConfigurer;

firstMapperScannerConfigurer 指定了 priv.dylan.space.mapper.mydb 这底下的类全部使用 firstSqlSessionFactory,也就是使用 classpath:mappers/mydb/*.xml 这底下的 mapper xml 文件;

而 firstSqlSessionFactory 又使用了 firstDataSource,也就是第一个 mysql 配置去链接 mysql;

c. secondMapperScannerConfigurer 类似;

这样,我们为每个 mapper 接口类指定了 mapper xml 文件,并且指定了执行 sql 的数据库信息,也就能做到支持多个数据库了;

4. 调整项目目录结构;

  • entity 包按不同数据库划分(建议);

  • mapper 包按不同数据库划分;

  • mapper xml 按不同数据库划分;

  • 其他如 service 层、controller 层、domain 等,自行评估,可选;

  • 结构如:

项目结构

如此,就能在 springboot3 项目中使用2个或多个 mysql 数据库啦~

当然,我们还可以参考使用 dynamic-datasource-spring-boot-starter 包:
《Spring Boot之多数据库源:极简方案》

如果本文对您有帮助,麻烦点赞、关注!

谢谢!

相关文章

网友评论

      本文标题:Spring Boot3+Mybatis 集成2个Mysql数据

      本文链接:https://www.haomeiwen.com/subject/hbeltjtx.html