双数据源 - 方式二

个人博客地址
包扫描方式

上文写到的第一种方法aop没有切到父类方法,解决方法也有多种;可以百度搜下;

这篇文章的方案是: 不同的包对应不同的数据源 ;

这种访问的重点就是配置.配置只要对了; 就很简单

step1:配置datasource/mapperscanner/sqlsessionfactory

注意将原先的@MapperScan注解干掉,下面会自定义


    @Bean("sqlServerDS")
    @Primary
    @ConfigurationProperties(prefix = "sqlserver.datasource")
    public DataSource sqlServerDS() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean("mysqlDS")
    @ConfigurationProperties(prefix = "mysql.datasource")
    public DataSource mysqlDS() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }


    @Primary
    @Bean
    public SqlSessionFactory sqlServerSqlSessionFactory(@Qualifier("sqlServerDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Bean
    public MapperScannerConfigurer sqlServerMapperScanner() {
        MapperScannerConfigurer sqlServerMapperScanner = new MapperScannerConfigurer();
        sqlServerMapperScanner.setSqlSessionFactoryBeanName("sqlServerSqlSessionFactory");
        sqlServerMapperScanner.setBasePackage("com.freemud.order.dao.sqlserver");

        Properties properties = new Properties();
        properties.setProperty("mappers", Mapper.class.getName());
        properties.setProperty("notEmpty", "false");
        properties.setProperty("IDENTITY", "SqlServer");

        sqlServerMapperScanner.setProperties(properties);
        return sqlServerMapperScanner;
    }

    @Bean
    public MapperScannerConfigurer mysqlMapperScanner() {
        MapperScannerConfigurer sqlServerMapperScanner = new MapperScannerConfigurer();
        sqlServerMapperScanner.setSqlSessionFactoryBeanName("mysqlSqlSessionFactory");
        sqlServerMapperScanner.setBasePackage("com.freemud.order.dao.mysql");

        Properties properties = new Properties();
        properties.setProperty("mappers", Mapper.class.getName());
        properties.setProperty("notEmpty", "false");
        properties.setProperty("IDENTITY", "MySQL");

        sqlServerMapperScanner.setProperties(properties);
        return sqlServerMapperScanner;
    }


step2: 整理自己的代码分层

比如将原先的dao 分为dao.mysql; 和dao.sqlserver; 不同的数据源对应不同的包这样子

step3: 代码使用

本次使用的场景是数据库逐步迁移; 因此做了黑白名单,默认sqlserver; 上了名单走mysql

  public BaseResponse queryOrderListByTime(OrderVo vo) {
        List orderDtos ;
        if (vo.getDsTypeEnum() == DSTypeEnum.SQLSERVER) {
            orderDtos = orderDao.selectByOrderVo(vo);
        }else{
            orderDtos = mySqlOrderDao.selectByOrderVo(vo);
        }
        return ResponseUtil.success(orderDtos);
    }

注意事项

  • 不同的datasource的配置略有不同,比如durid的是url; 而HikariDataSource是jdbc-url
  • 项目中原先的@MapperScan要干掉;
  • MapperScannerConfigurer这个要注意; 因为代码有一定演示意义在内,实际中如果你继承的不是Mapper;而是自定义的需要加到这里面; 多个就用逗号隔开

你可能感兴趣的:(双数据源 - 方式二)