Spring Boot 中使用 MyBatis 多数据源配置及引用
在使用 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") 注解指定要使用的 SqlSessionFactory 为 sqlSessionFactory1。同理,使用 @Qualifier("sqlSessionFactory2") 注解指定要使用的 SqlSessionFactory 为 sqlSessionFactory2。在调用 getUser1 和 getUser2 方法时,分别使用不同的 SqlSessionFactory 来执行对应的 Mapper。
小结
通过以上步骤,我们成功地配置了多个数据源,并在程序中通过 @Qualifier 注解引用了特定数据源的 SqlSessionFactory,实现对不同数据源的访问。这种方法简单易懂,方便管理和维护多个数据源。
原文地址: https://www.cveoy.top/t/topic/od5C 著作权归作者所有。请勿转载和采集!