下面我们就来详细讲解一下“Spring Boot 整合 mybatis 使用多数据源的实现方法”:
什么是多数据源
在一个系统中,通常会使用多个数据库,比如一个系统中需要同时操作 MySQL 和 Oracle 数据库。这就需要在系统中使用多个数据源,分别连接并操作不同的数据库。
Spring Boot 整合 mybatis 使用多数据源的实现方法
添加相关依赖
我们首先需要在项目的 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
其中,mybatis-spring-boot-starter
是 mybatis 的 Spring Boot 起步依赖,druid-spring-boot-starter
是一个连接池。
配置多数据源
在配置多数据源之前,我们需要先在配置文件 application.properties
中添加连接数据库的配置信息,以及连接池的相关配置信息:
# mysql1 数据源配置
jdbc.mysql1.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
jdbc.mysql1.username=root
jdbc.mysql1.password=root
# mysql2 数据源配置
jdbc.mysql2.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
jdbc.mysql2.username=root
jdbc.mysql2.password=root
# 数据库连接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-wait=60000
然后我们需要在 Spring Boot 的配置文件中添加多个数据源的配置:
@Configuration
public class DataSourceConfig {
// 配置 mysql1 数据源
@Bean(name = "mysql1DataSource")
@ConfigurationProperties(prefix = "jdbc.mysql1")
public DataSource mysql1DataSource() {
return DruidDataSourceBuilder.create().build();
}
// 配置 mysql2 数据源
@Bean(name = "mysql2DataSource")
@ConfigurationProperties(prefix = "jdbc.mysql2")
public DataSource mysql2DataSource() {
return DruidDataSourceBuilder.create().build();
}
}
配置 Mybatis
在 Spring Boot 中配置 Mybatis 有两种方式:一种是使用注解,一种是使用 XML 文件。我们这里使用注解的方式来配置 Mybatis。
在配置 Mybatis 之前,我们需要先在 application.properties
中配置扫描 mybatis mapper 文件的路径:
mybatis.mapper-locations=classpath:mapper/*.xml
然后我们需要在 Spring Boot 的配置文件中添加一个 SqlSessionFactory 的配置:
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper", sqlSessionFactoryRef = "mysql1SqlSessionFactory")
public class MybatisConfig {
// 配置 mysql1 SqlSessionFactory
@Bean(name = "mysql1SqlSessionFactory")
public SqlSessionFactory mysql1SqlSessionFactory(@Qualifier("mysql1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
// 使用 mybatis mapper 文件扫描器
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
// 配置 mysql2 SqlSessionFactory
@Bean(name = "mysql2SqlSessionFactory")
public SqlSessionFactory mysql2SqlSessionFactory(@Qualifier("mysql2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
// 使用 mybatis mapper 文件扫描器
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "mysql1SqlSessionTemplate")
public SqlSessionTemplate mysql1SqlSessionTemplate(@Qualifier("mysql1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "mysql2SqlSessionTemplate")
public SqlSessionTemplate mysql2SqlSessionTemplate(@Qualifier("mysql2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
在上面的代码中,我们先使用 @MapperScan
注解来指定 mapper 文件的扫描路径和 SqlSessionFactory 的名称。然后分别配置两个 SqlSessionFactory,最后使用 SqlSessionTemplate
来封装 SqlSession。
完成多数据源的整合
完成上述步骤之后,我们就可以在代码中使用多数据源了。比如,我们要操作 mysql1 数据库中的 user 表和 mysql2 数据库中的 order 表:
@Service
public class UserService {
@Autowired
@Qualifier("mysql1SqlSessionTemplate")
private SqlSessionTemplate mysql1SqlSessionTemplate;
@Autowired
@Qualifier("mysql2SqlSessionTemplate")
private SqlSessionTemplate mysql2SqlSessionTemplate;
public List<User> getUserList() {
return mysql1SqlSessionTemplate.selectList("com.example.demo.mapper.UserMapper.getUserList");
}
public List<Order> getOrderList() {
return mysql2SqlSessionTemplate.selectList("com.example.demo.mapper.OrderMapper.getOrderList");
}
}
可以看到,我们在使用 mybatis 操作数据库时,需要通过 @Autowired
和 @Qualifier
来注入对应的 SqlSessionTemplate,然后就可以通过执行 SQL 语句来操作对应的数据源了。
示例代码
最后,给出两个示例代码:
示例一
在这个示例中,我们使用一个 UserController
来操作 mysql1 数据库中的 user
表,使用一个 OrderController
来操作 mysql2 数据库中的 order
表。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<User> getUserList() {
return userService.getUserList();
}
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<Order> getOrderList() {
return userService.getOrderList();
}
}
在上面的代码中,我们使用 @Autowired
来注入 Uservice
,然后在 UserController
中调用 userService.getUserList()
方法来获取 mysql1 数据库中的 user
表信息,在 OrderController
中调用 userService.getOrderList()
方法来获取 mysql2 数据库中的 order
表信息。
示例二
在这个示例中,我们定义了一个 UserMapper
和一个 OrderMapper
,分别用来处理 mysql1 数据库和 mysql2 数据库中的数据。
public interface UserMapper {
List<User> getUserList();
}
public interface OrderMapper {
List<Order> getOrderList();
}
@Service
public class UserService {
@Autowired
@Qualifier("mysql1SqlSessionTemplate")
private SqlSessionTemplate mysql1SqlSessionTemplate;
@Autowired
@Qualifier("mysql2SqlSessionTemplate")
private SqlSessionTemplate mysql2SqlSessionTemplate;
public List<User> getUserList() {
return mysql1SqlSessionTemplate.getMapper(UserMapper.class).getUserList();
}
public List<Order> getOrderList() {
return mysql2SqlSessionTemplate.getMapper(OrderMapper.class).getOrderList();
}
}
在上面的代码中,我们分别定义了 UserMapper
和 OrderMapper
接口,然后在 UserService
中分别使用 mysql1SqlSessionTemplate.getMapper(UserMapper.class)
和 mysql2SqlSessionTemplate.getMapper(OrderMapper.class)
方法来获取对应的 Mapper
,最后调用对应的方法来操作数据库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 整合mybatis 使用多数据源的实现方法 - Python技术站