1.创建插件类
2.注解类,标志该类是否需要切换数据源
3.实体类使用注解标志
4.创建配置插件类
1.
package com.upmsproj.wp.common.plugin;
import com.upmsproj.wp.common.ChangeDataSource;
import com.upmsproj.wp.common.config.datasource.DynamicDataSourceContextHolder;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.springframework.beans.factory.annotation.Value;
import java.util.Properties;
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}
)
})
public class ChangeDataSourceHandler implements Interceptor {
@Value("${customer.sysDataBase}")
private String sysDataBase;
private Boolean needChangeDataBase(Invocation invocation){
Object[] args = invocation.getArgs();
Class<?> entityClass = args[1].getClass(); //实体类对象
ChangeDataSource declaredAnnotation = entityClass.getDeclaredAnnotation(ChangeDataSource.class);
return "YES".equals(declaredAnnotation.value());
}
@Override
public Object intercept(Invocation invocation) throws Throwable {
if(needChangeDataBase(invocation)){
DynamicDataSourceContextHolder.setDataSourceRouterKey(sysDataBase);
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
@Override
public void setProperties(Properties properties) {
}
}
2.
package com.upmsproj.wp.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ChangeDataSource {
String value() default "NO" ;
}
3.
package com.upmsproj.wp.basicdata.entity;
import com.upmsproj.wp.common.ChangeDataSource;
import com.upmsproj.wp.common.config.datasource.DataBase;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonProperty;
@ApiModel
@Table(name = "dbo.PMS_MESSAGESET")
@ChangeDataSource("YES")
public class PMS_MESSAGESET {
@Api

本文介绍了如何在Spring Boot项目中创建插件类实现数据源切换,通过注解标记需要切换的数据源实体,并创建配置插件来管理数据源。实例展示了如何使用`ChangeDataSource`注解和`ChangeDataSourceHandler`拦截器来确保在执行特定操作时自动切换数据库。
最低0.47元/天 解锁文章
4223

被折叠的 条评论
为什么被折叠?



