c语言编程笔录

首页 >   > 笔记大全

笔记大全

mybatisplus如何实现数据库动态认证

更新时间:2023-10-31

什么是MybatisPlus?

MybatisPlus(简称MP)是Mybatis的增强工具,它在Mybatis的基础上做了很多扩展和增强,可以简化开发,提高效率。它提供了代码生成器,可以自动生成单表的CRUD操作,减少了繁琐的重复代码。MybatisPlus还提供了很多通用方法和结构体,可以便捷地完成各种复杂的数据库操作。

为什么要实现数据库动态认证?

在实际开发中,我们可能需要在同一个系统中连接多个不同的数据库。而这些数据库的连接信息通常不一样,例如用户名、密码、数据库类型等。这时候我们就需要实现数据库的动态认证,可以根据不同的数据库连接信息,动态地切换数据源,方便地完成各种操作。

如何实现数据库动态认证?

MybatisPlus提供了多数据源的功能。我们可以在application.yml文件中配置多个数据源:

spring:
  datasource:
    dynamic:
      primary: ds-master
      datasource:
        ds-master:
          url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
        ds-slave:
          url: jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver

其中spring.datasource.dynamic.primary为指定的主数据源。

然后我们需要定义多数据源的Bean,继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法,根据业务需求自行实现数据源的切换逻辑:

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

其中DataSourceContextHolder为自定义的数据源上下文类,使用ThreadLocal来存储当前线程使用的数据源key。

然后我们需要创建一个切面,在需要切换数据源的方法上使用@DS注解,动态切换数据源:

@Aspect
@Component
public class DataSourceAspect {
    @Pointcut("@annotation(com.baomidou.mybatisplus.annotation.DS)")
    public void dsPointCut() {}

    @Before("dsPointCut() && @annotation(ds)")
    public void beforeDataSourceSwitch(DS ds) {
        String dsName = ds.value();
        DataSourceContextHolder.setDataSource(dsName);
    }

    @After("dsPointCut()")
    public void afterDataSourceSwitch() {
        DataSourceContextHolder.clearDataSource();
    }
}

其中,@DS注解可用于类或方法上,用来指定使用的数据源。DataSourceContextHolder用于在当前线程中存储数据源的key。

总结

MybatisPlus是一个非常好用的ORM框架,可以快速地完成各种数据库操作。通过实现动态数据源的认证,我们可以方便地在同一个系统中使用多个不同的数据库,并且在数据源的切换上具有很高的灵活性,能够更好地适应复杂的业务需求。