mybatisplus interceptor 多数据源
时间: 2023-09-09 21:11:26 浏览: 48
对于 MyBatis-Plus 的拦截器与多数据源的结合,可以通过以下步骤实现:
1. 创建多个数据源配置类:针对每个数据源创建对应的数据源配置类,其中包含数据源的配置信息,例如数据库连接信息、事务管理器等。
2. 创建动态数据源路由类:自定义一个实现 AbstractRoutingDataSource 的动态数据源路由类,重写 determineCurrentLookupKey 方法,根据业务逻辑动态决定使用哪个数据源。
3. 创建拦截器类:实现 Interceptor 接口,重写 intercept 方法,在该方法中获取当前线程的数据源标识,并将其设置到 MyBatis 的 Configuration 对象中。
4. 配置拦截器和动态数据源路由:在 MyBatis 的配置文件中,配置拦截器和动态数据源路由类。
示例代码如下:
1. 数据源配置类示例:
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "sqlSessionTemplate")
public class DataSourceConfig {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.ds1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
@Bean(name = "routingDataSource")
@Primary
public AbstractRoutingDataSource routingDataSource(@Qualifier("dataSource1") DataSource dataSource1,
@Qualifier("dataSource2") DataSource dataSource2) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("ds1", dataSource1);
targetDataSources.put("ds2", dataSource2);
DynamicRoutingDataSource routingDataSource = new DynamicRoutingDataSource();
routingDataSource.setDefaultTargetDataSource(dataSource1);
routingDataSource.setTargetDataSources(targetDataSources);
return routingDataSource;
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("routingDataSource") DataSource routingDataSource)
throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(routingDataSource);
return sessionFactoryBean.getObject();
}
@Bean(name = "sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
2. 动态数据源路由类示例:
```java
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 根据业务逻辑动态决定使用哪个数据源,这里可以根据线程上下文中的数据源标识进行判断
return DynamicDataSourceContextHolder.getDataSourceKey();
}
}
```
3. 拦截器类示例:
```java
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class DataSourceInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取当前线程的数据源标识
String dataSourceKey = DynamicDataSourceContextHolder.getDataSourceKey();
// 将数据源标识设置到 MyBatis 的 Configuration 对象中
Configuration configuration = ((MappedStatement) invocation.getArgs()[0]).getConfiguration();
configuration.setEnvironment(new Environment(dataSourceKey, configuration.getEnvironment().getTransactionFactory(), configuration.getEnvironment().getDataSource()));
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置拦截器的属性
}
}
```
4. 配置拦截器和动态数据源路由:在 MyBatis 的配置文件中配置拦截器和动态数据源路由类。
```xml
<configuration>
<plugins>
<plugin interceptor="com.example.interceptor.DataSourceInterceptor"/>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="org.springframework.jdbc.datasource.DataSourceTransactionManager"/>
<dataSource type="com.example.datasource.DynamicRoutingDataSource"/>
</environment>
</environments>
</configuration>
```
通过以上步骤,你可以结合 MyBatis-Plus 的拦截器和自定义的动态数据源路由类实现多数据源的操作。