使用mybatis+springboot在applicationyaml中配置了多个数据源如何在程序中引用某个SqlSessionFactory
在使用多个数据源时,每个数据源都需要配置一个对应的SqlSessionFactory。可以使用@Qualifier注解来指定要使用哪个SqlSessionFactory。具体步骤如下:
- 在配置文件中为每个数据源配置一个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,如:
@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();
}
}
- 在代码中使用@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
原文地址: https://www.cveoy.top/t/topic/form 著作权归作者所有。请勿转载和采集!