一文搞懂MyBatis多数据源Starter实现
多数据源在一些应用场景下非常常见,MyBatis也提供了多数据源的支持。但是对于开发者来说,要手动实现多数据源的切换非常繁琐,而且容易出错。MyBatis多数据源Starter可以帮助我们自动配置多数据源并提供切换功能。本文将对MyBatis多数据源Starter的使用进行详细讲解。
步骤一:添加依赖
首先,我们需要在项目中添加MyBatis多数据源Starter的依赖。在Maven项目中,在pom.xml
文件中添加如下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.5</version>
</dependency>
步骤二:配置数据源
在application.properties
或application.yml
中配置多数据源。下面是一个简单的例子:
# 主数据源
spring.datasource.master.url=jdbc:mysql://localhost:3306/master
spring.datasource.master.username=root
spring.datasource.master.password=root
# 从数据源
spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave
spring.datasource.slave.username=root
spring.datasource.slave.password=root
在这个例子中,我们配置了两个数据源,一个主数据源和一个从数据源。
步骤三:使用数据源
对于使用MyBatis多数据源Starter的开发者来说,需要使用@DS
注解指定数据源。每个需要调用数据源的方法上都要添加@DS
注解。
例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@DS("master")
@Override
public List<User> getUsersFromMaster() {
return userMapper.selectAll();
}
@DS("slave")
@Override
public List<User> getUsersFromSlave() {
return userMapper.selectAll();
}
}
在这个例子中,我们使用了@DS
注解指定了数据源。@DS
注解后面的参数就是配置文件中配置的数据源的key。
示例一:读写分离
读写分离是多数据源的常用场景。我们通过配置数据源,使用@DS
注解以及MySQL的主从复制功能,来实现简单的读写分离。
第一步:配置主从数据库
在application.yml
中配置主数据库和从数据库:
# 主数据源
spring.datasource.master.url=jdbc:mysql://localhost:3306/master
spring.datasource.master.username=root
spring.datasource.master.password=root
# 从数据源
spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave
spring.datasource.slave.username=root
spring.datasource.slave.password=root
# 数据源配置:开启主从
spring.datasource.dynamic.enable=true
spring.datasource.dynamic.type=org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.strict=true
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&zeroDateTimeBehavior=convertToNull&autoReconnectForPools=true&allowMultiQueries=true
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&zeroDateTimeBehavior=convertToNull&autoReconnectForPools=true&allowMultiQueries=true
第二步:使用@DS注解
在DAO层方法上使用@DS
注解,来指定使用主库或从库。例如:
@DS("master")
@Insert("insert into user(name, age) values(#{name}, #{age})")
int insertMaster(User user);
@DS("slave")
@Insert("insert into user(name, age) values(#{name}, #{age})")
int insertSlave(User user);
示例二:动态添加数据源
动态添加数据源是MyBatis多数据源Starter的另一个特性。我们可以在运行时动态的添加数据源。
在下面的示例中,我们使用DynamicDataSourceProvider
来创建一个新的数据源。
// 动态创建数据源
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("newDataSource", DataSourceBuilder.create().url("jdbc:mysql://localhost:3306/new_db").username("root").password("root").build());
DynamicDataSourceContextHolder.push(dataSourceName);
DynamicRoutingDataSource dynamicRoutingDataSource = ApplicationContextProvider.getBean(DynamicRoutingDataSource.class);
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
dynamicRoutingDataSource.afterPropertiesSet();
// 使用新的数据源
@DS("newDataSource")
@Select("select * from new_table")
List<NewTable> selectFromNewDataSource();
这个例子演示了如何通过动态创建数据源来使用一个新的数据源。
总结
MyBatis多数据源Starter是一个非常好用的工具,在多数据源场景下能够提供很好的帮助。在本文中,我们介绍了如何集成MyBatis多数据源Starter,并提供了两个实际的例子。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂MyBatis多数据源Starter实现 - Python技术站