在使用多个数据源时,每个数据源都需要配置一个对应的SqlSessionFactory。可以使用@Qualifier注解来指定要使用哪个SqlSessionFactory。具体步骤如下:

  1. 在配置文件中为每个数据源配置一个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
  1. 在代码中注入所有的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();
    }

}

  1. 在代码中使用@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")注解指定要使用的SqlSessionFactory为sqlSessionFactory1。同理,使用@Qualifier("sqlSessionFactory2")注解指定要使用的SqlSessionFactory为sqlSessionFactory2。在调用getUser1和getUser2方法时,分别使用不同的SqlSessionFactory来执行对应的Mapper

使用mybatis+springboot在applicationyaml中配置了多个数据源如何在程序中引用某个SqlSessionFactory

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

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