mybatisplus动态数据源
时间: 2023-06-29 22:03:18 浏览: 115
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上增加了许多实用的功能,其中就包括动态数据源的支持。
MyBatis-Plus 的动态数据源实现,主要是通过使用 Spring 提供的 AbstractRoutingDataSource 类和 ThreadLocal 来实现的。具体步骤如下:
1. 首先需要在 Spring 的配置文件中配置多个数据源,并且将这些数据源注入到 AbstractRoutingDataSource 类中。
2. 然后通过自定义一个继承自 AbstractRoutingDataSource 的数据源路由类,重写它的 determineCurrentLookupKey() 方法,该方法根据当前线程的 ThreadLocal 中保存的数据源标识来选择对应的数据源。
3. 最后,将自定义的数据源路由类注入到 Spring 的事务管理器中即可。
示例配置:
```xml
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 数据源配置 -->
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 数据源配置 -->
</bean>
<bean id="dataSource" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
<property name="dataSource" ref="dataSourceRouter"/>
</bean>
<bean id="dataSourceRouter" class="com.example.DataSourceRouter">
<property name="targetDataSources">
<map>
<entry key="dataSource1" value-ref="dataSource1"/>
<entry key="dataSource2" value-ref="dataSource2"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceRouter"/>
</bean>
```
自定义数据源路由类:
```java
public class DataSourceRouter extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
dataSourceHolder.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
return dataSourceHolder.get();
}
}
```
在业务代码中,可以通过调用 DataSourceRouter.setDataSource() 方法来设置当前线程要使用的数据源标识。
```java
// 使用 dataSource1 数据源
DataSourceRouter.setDataSource("dataSource1");
// 使用 dataSource2 数据源
DataSourceRouter.setDataSource("dataSource2");
```
这样就可以实现动态地切换数据源了。注意,数据源切换要在事务开启之前进行,否则事务会失效。
阅读全文