美文网首页
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