下面是针对“springboot集成@DS注解实现数据源切换的方法示例”的详细讲解,包括两个示例。
一、简介
在Spring Boot中,实现数据源切换最常用的方式是使用@DS注解。它可以在运行时动态地切换数据源。这个注解是基于MyBatis-Plus的,需要引入MyBatis-Plus的核心依赖。
二、操作步骤
1. 引入相关依赖
在pom.xml文件中加入以下依赖:
<!-- 引入MyBatis-Plus核心依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
2. 定义数据源配置类
创建一个DataSourceConfig类,用于定义数据源的相关信息,其中@Primary注解用于定义主数据源。
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper")
@EnableTransactionManagement
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
@Primary
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public DynamicDataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource());
dataSourceMap.put("slave", slaveDataSource());
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
return dynamicDataSource;
}
@Bean
@ConditionalOnMissingBean(SqlSessionFactory.class)
public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
@Bean
@ConditionalOnMissingBean(SqlSessionTemplate.class)
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
3. 定义数据源切换注解
创建一个注解,用于声明需要切换到哪个数据源。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DS {
String value() default "master";
}
4. 定义数据源切换切面
创建一个切面,用于在执行数据库操作前切换数据源。
@Slf4j
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.example.demo.annotation.DS)")
public void dsPointCut() {}
@Around("dsPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
DS ds = signature.getMethod().getAnnotation(DS.class);
if (ds == null) {
DynamicDataSourceContextHolder.setDataSourceKey("master");
} else {
DynamicDataSourceContextHolder.setDataSourceKey(ds.value());
}
try {
return point.proceed();
} finally {
DynamicDataSourceContextHolder.clearDataSourceKey();
}
}
}
5. 使用@DS注解切换数据源
在需要切换数据源的Service或Mapper中使用@DS注解。如果不加@DS注解,则默认使用主数据源。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DS("slave")
public List<User> list() {
return userMapper.selectList(null);
}
}
三、示例
示例1
以下示例中,我们通过调用UserService的list()方法来实现数据源的切换。由于这里使用了@DS注解,所以数据源会切换到slave数据源。
创建用户表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建一个User实体类,用于封装用户信息:
@Data
@EqualsAndHashCode(callSuper = false)
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 姓名
*/
@TableField("name")
private String name;
/**
* 性别
*/
@TableField("sex")
private String sex;
}
创建UserMapper,用于操作用户表:
public interface UserMapper extends BaseMapper<User> {
}
创建UserService,用于调用UserMapper来操作数据库:
public interface UserService {
List<User> list();
}
创建UserServiceImpl,实现UserService:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DS("slave")
public List<User> list() {
return userMapper.selectList(null);
}
}
最后,在Controller中调用UserService的list()方法,来获取所有用户信息:
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> list() {
return userService.list();
}
}
示例2
以下示例中,我们使用了@EnableAspectJAutoProxy注解,来开启自动代理,从而实现数据源的切换。
创建User2实体类:
@Data
public class User2 {
/**
* 用户ID
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String mobile;
}
创建User2Mapper:
@Mapper
public interface User2Mapper {
@DS("slave")
@Select("select * from user2")
List<User2> list();
@Insert("insert into user2(username, password, email, mobile) values(#{username}, #{password}, #{email}, #{mobile})")
void insert(User2 user2);
}
创建UserService2:
@Service
public class UserService2 {
@Autowired
private User2Mapper user2Mapper;
public List<User2> list() {
return user2Mapper.list();
}
public void insert(User2 user2) {
user2Mapper.insert(user2);
}
}
创建UserController2:
@RestController
public class UserController2 {
@Autowired
private UserService2 userService2;
@RequestMapping("/users2")
public List<User2> list() {
return userService2.list();
}
@RequestMapping("/insert")
public String insert() {
User2 user2 = new User2();
user2.setUsername("test");
user2.setPassword("123456");
user2.setEmail("test@example.com");
user2.setMobile("13800138000");
userService2.insert(user2);
return "success";
}
}
最后,在Application类中添加@EnableAspectJAutoProxy注解,并运行程序,通过curl命令测试:
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class App {
public static void main( String[] args ) {
SpringApplication.run(App.class, args);
}
}
curl http://localhost:8080/users2
四、总结
通过以上步骤,我们就可以实现在Spring Boot中使用@DS注解来实现数据源切换了。在实际的项目中,我们可能需要对数据源进行更加复杂的配置,但是这并不影响我们使用@DS注解来实现数据源的切换,使得我们的应用更加灵活多变。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot集成@DS注解实现数据源切换的方法示例 - Python技术站