mybatisplus 支持多数据源 示例
时间: 2023-05-10 11:51:03 浏览: 66
作为一个非常常用的Java ORM框架,Mybatis-Plus不仅提供了很多优秀的通用CRUDAPI的实现,同时也支持多数据源的使用。通过使用mybatisplus框架的多数据源实现,我们可以实现对多个数据库的读写,支持更加灵活的业务需求。
Mybatis-Plus提供了多数据源的支持,实现方式可以通过创建多个数据源,每个数据源对应各自的相关配置。多数据源的实现十分简单,只需要在spring配置文件中添加对应数据源的配置即可。一些可选的配置包括数据库连接、用户名、密码、驱动名称等。
在mybatisplus框架提供的多数据源模式中,我们需要通过配置文件将多个数据源的配置信息导入到项目中。在配置文件中,可以利用不同的关键字区分各个数据源的配置。配置完成后,通过编写mybatis注解来对具体的数据源进行操作,最终实现对多数据库的读写。在使用注解时,我们需要使用@Mapper注解将JAVA类与对应的数据库表进行映射。同时,在对应的方法上使用@Select、@Insert等方法来进行操作。
总的来说,mybatisplus框架提供了非常优秀的支持多数据源的功能,在实际开发过程中,我们可以通过配置多个数据源,利用简单的mybatis注解来实现对多数据库的读写。这种方式不仅方便开发,同时也大大提高了系统的灵活性和稳定性。
相关问题
mybatisplus interceptor 多数据源
对于 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 的拦截器和自定义的动态数据源路由类实现多数据源的操作。
mybatisplus 多数据源
MybatisPlus 支持多数据源配置,可以通过配置多个数据源来实现对不同数据库的读写操作。下面是一个简单的多数据源配置示例:
1. 配置多个数据源
```java
@Configuration
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();
}
}
```
2. 配置 MybatisPlus 的数据源和事务管理器
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class MybatisPlusConfig {
@Autowired
@Qualifier("dataSource1")
private DataSource dataSource1;
@Autowired
@Qualifier("dataSource2")
private DataSource dataSource2;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dynamicDataSource());
return factoryBean.getObject();
}
@Bean
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("dataSource1", dataSource1);
dataSourceMap.put("dataSource2", dataSource2);
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(dataSource1);
return dynamicDataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dynamicDataSource());
}
}
```
3. 配置数据源的路由策略
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
4. 在需要切换数据源的地方设置数据源的 key
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
```
这样就可以在不同的操作中切换不同的数据源了。例如:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsersFromDataSource1() {
DataSourceContextHolder.setDataSourceKey("dataSource1");
return userMapper.selectAll();
}
public List<User> getAllUsersFromDataSource2() {
DataSourceContextHolder.setDataSourceKey("dataSource2");
return userMapper.selectAll();
}
}
```
以上是一个简单的 MybatisPlus 多数据源配置示例,具体实现可以根据自己的业务需求进行调整。