在使用 MyBatis 与 Spring Boot 进行开发时,有时需要连接多个数据库。本文将介绍如何在 Spring Boot 中配置多个数据源,以及如何在程序中引用特定数据源的 SqlSessionFactory,实现对不同数据源的访问。

配置多个数据源

首先,需要在 application.yaml 配置文件中为每个数据源配置一个 SqlSessionFactory

mybatis:
  configuration:
    map-underscore-to-camel-case: true

datasource1:
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/db1
  username: root
  password: root
mybatis1:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath:mapper1/*.xml
  type-aliases-package: com.example.entity1

datasource2:
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/db2
  username: root
  password: root
mybatis2:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath:mapper2/*.xml
  type-aliases-package: com.example.entity2

注入 SqlSessionFactory

在代码中,需要分别注入每个数据源的 SqlSessionFactory

@Configuration
@MapperScan(basePackages = "com.example.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {

    @Bean
    @ConfigurationProperties(prefix = "datasource1")
    public DataSource dataSource1() {
        return new DruidDataSource();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource1,
                                                 @Qualifier("mybatis1") Resource mybatis1) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource1);
        sessionFactory.setConfigLocation(mybatis1);
        return sessionFactory.getObject();
    }

}

@Configuration
@MapperScan(basePackages = "com.example.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config {

    @Bean
    @ConfigurationProperties(prefix = "datasource2")
    public DataSource dataSource2() {
        return new DruidDataSource();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource2,
                                                 @Qualifier("mybatis2") Resource mybatis2) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource2);
        sessionFactory.setConfigLocation(mybatis2);
        return sessionFactory.getObject();
    }

}

使用 SqlSessionFactory

在需要使用 SqlSessionFactory 的地方,使用 @Qualifier 注解指定要使用的 SqlSessionFactory

@Service
public class UserService {

    @Autowired
    @Qualifier("sqlSessionFactory1")
    private SqlSessionFactory sqlSessionFactory1;

    @Autowired
    @Qualifier("sqlSessionFactory2")
    private SqlSessionFactory sqlSessionFactory2;

    public void getUser1() {
        try (SqlSession sqlSession = sqlSessionFactory1.openSession()) {
            UserMapper1 mapper1 = sqlSession.getMapper(UserMapper1.class);
            mapper1.getUserById(1);
        }
    }

    public void getUser2() {
        try (SqlSession sqlSession = sqlSessionFactory2.openSession()) {
            UserMapper2 mapper2 = sqlSession.getMapper(UserMapper2.class);
            mapper2.getUserById(1);
        }
    }

}

在上述代码中,使用 @Qualifier("sqlSessionFactory1") 注解指定要使用的 SqlSessionFactorysqlSessionFactory1。同理,使用 @Qualifier("sqlSessionFactory2") 注解指定要使用的 SqlSessionFactorysqlSessionFactory2。在调用 getUser1getUser2 方法时,分别使用不同的 SqlSessionFactory 来执行对应的 Mapper。

小结

通过以上步骤,我们成功地配置了多个数据源,并在程序中通过 @Qualifier 注解引用了特定数据源的 SqlSessionFactory,实现对不同数据源的访问。这种方法简单易懂,方便管理和维护多个数据源。

Spring Boot 中使用 MyBatis 多数据源配置及引用

原文地址: https://www.cveoy.top/t/topic/od5C 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录