要注意的是,在使用MyBatis时,注解@TargetDataSource 不能直接在接口类Mapper上使用。
按上面的代码中StudentMapper为接口,代码如下:
import java.util.List;
import org.springboot.sample.entity.Student;
/**
-
StudentMapper,映射SQL语句的接口,无逻辑实现
-
@author 单红宇(365384722)
-
@myblog http://blog.csdn.net/catoop/
-
@create 2016年1月20日
*/
public interface StudentMapper {
// 注解 @TargetDataSource 不可以在这里使用
List likeName(String name);
Student getById(int id);
String getNameById(int id);
}
请将下面几个类放到Spring Boot项目中。
DynamicDataSource.Java
DynamicDataSourceAspect.java
DynamicDataSourceContextHolder.java
DynamicDataSourceRegister.java
TargetDataSource.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
-
动态数据源
-
@author 单红宇(365384722)
-
@myblog http://blog.csdn.net/catoop/
-
@create 2016年1月22日
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceType();
}
}
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
-
切换数据源Advice
-
@author 单红宇(365384722)
-
@myblog http://blog.csdn.net/catoop/
-
@create 2016年1月23日
*/
@Aspect
@Order(-1)// 保证该AOP在@Transactional之前执行
@Component
public class DynamicDataSourceAspect {
private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceAspect.class);
@Before(“@annotation(ds)”)
public void changeDataSource(JoinPoint point, TargetDataSource ds) throws Throwable {
St