springboot集成@DS注解实现数据源切换的方法示例

下面是针对“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注解来实现数据源的切换,使得我们的应用更加灵活多变。

阅读剩余 86%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot集成@DS注解实现数据源切换的方法示例 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • javascript委托(Delegate)blur和focus用法实例分析

    JavaScript 委托(Delegate)blur和focus用法实例分析 在 JavaScript 中,我们常常需要对页面元素添加一些事件,比如 click、mouseover、keyup 等等。但是,如果页面中有很多元素,我们就需要对每个元素都添加事件,这样做会显得很麻烦。所以,JavaScript 委托(Delegate)blur和focus用法应…

    Java 2023年6月15日
    00
  • Java如何读写Properties配置文件(Properties类)

    下面我将详细讲解“Java如何读写Properties配置文件(Properties类)”的完整攻略。 什么是Properties配置文件 Properties文件是Java中一种非常常用的配置文件格式,它采用Key-Value的形式存储数据,是一种轻量级的配置文件。Properties文件一般用于存储应用程序配置信息,如数据库连接信息、系统配置信息等。 P…

    Java 2023年6月15日
    00
  • 吃透SpringMVC面试八股文

    说说你对 SpringMVC 的理解 SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。 它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。 什么是MVC模式? MVC的全名是Model View Control…

    Java 2023年4月20日
    00
  • js实现窗口全屏示例详解

    首先,实现网页全屏有两种方式:一种是使用原生JavaScript,另一种是使用第三方库。 使用原生JavaScript实现窗口全屏 function fullscreen() { var elem = document.documentElement; if (elem.requestFullscreen) { elem.requestFullscreen(…

    Java 2023年5月23日
    00
  • 使用Maven搭建SpringMVC项目的步骤(图文教程)

    使用Maven搭建SpringMVC项目,可以使得项目的依赖管理和构建变得更加简单和方便。以下是该步骤的完整攻略: 步骤一:配置Maven 在安装Maven之前,要确保Java环境已正确设置。在下载Maven后,根据官方文档进行配置。 步骤二:创建Maven项目 打开Eclipse,选择File -> New -> Maven Project。 …

    Java 2023年5月16日
    00
  • SpringBoot实现简单的登录注册的项目实战

    Spring Boot 实现简单的登录注册的项目实战 在本文中,我们将介绍如何使用 Spring Boot 实现简单的登录注册功能。我们将使用 Thymeleaf 模板引擎和 Spring Security 安全框架来实现这个项目。 项目需求 我们将实现一个简单的登录注册功能,具体需求如下: 用户可以注册一个新账户。 用户可以使用已注册的账户登录。 登录成功…

    Java 2023年5月15日
    00
  • JDBC实现数据库增删改查功能

    下面是关于JDBC实现数据库增删改查功能的详细攻略。 1. 前置知识 在学习JDBC之前,需要先掌握以下知识: Java基础知识 SQL语言基础知识 数据库基础知识 2. JDBC简介 Java Database Connectivity (JDBC) 是Java语言操作数据库的标准接口,它提供了一组不依赖于特定数据库管理系统的通用API,使得我们能够通过J…

    Java 2023年5月20日
    00
  • Spring Data JPA 映射VO/DTO对象方式

    Spring Data JPA是Spring Framework中一个非常流行的模块,它提供了一种基于JPA的数据访问方式,简化了数据库访问的编码量。在实际应用中,我们通常需要将JPA实体类映射为业务层的DTO或者VO对象,本文将为大家详细介绍Spring Data JPA映射VO/DTO对象的完整攻略,包括以下几个方面: 为什么需要VO/DTO对象? 在实…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部