在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况
    在需要切换数据源ServiceMapper方法上添加@DataSource注解
    @DataSource(value = DataSourceType.MASTER),其中value用来表示数据源名称
    提示
    关于多数据源使用流程(如果有多个,可以参考slave添加)
    支持参数如下:

    参数 类型 默认值 描述
    value DataSourceType DataSourceType.MASTER 主库

    1、在application-druid.yml配置从库数据源

    1. # 从库数据源
    2. slave:
    3. # 从数据源开关/默认关闭
    4. enabled: true
    5. url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    6. username: root
    7. password: password

    2、在DataSourceType类添加数据源枚举

    /**
     * 从库
     */
    SLAVE
    

    3、在DruidConfig配置读取数据源

    @Bean
    @ConfigurationProperties("spring.datasource.druid.slave")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
    public DataSource slaveDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }
    

    4、在DruidConfigdataSource方法添加数据源

    setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
    

    5、在需要使用多数据源方法或类上添加@DataSource注解,其中value用来表示数据源

    @DataSource(value = DataSourceType.SLAVE)
    public List<SysUser> selectUserList(SysUser user)
    {
        return userMapper.selectUserList(user);
    }
    
    @Service
    @DataSource(value = DataSourceType.SLAVE)
    public class SysUserServiceImpl
    

    对于特殊情况可以通过DynamicDataSourceContextHolder手动实现数据源切换

    public List<SysUser> selectUserList(SysUser user)
    {
        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
        List<SysUser> userList = userMapper.selectUserList(user);
        DynamicDataSourceContextHolder.clearDataSourceType();
        return userList;
    }
    

    逻辑实现代码 com.runyang.framework.aspectj.DataSourceAspect
    注意:目前配置了一个从库,默认关闭状态。如果不需要多数据源不用做任何配置。 另外可新增多个从库。支持不同数据源(Mysql、Oracle、SQLServer)
    提示
    如果有Service方法内多个注解无效的情况使用内部方法调用
    SpringUtils.getAopProxy(this).xxxxxx(xxxx);