Mybatis动态数据源

背景

有时候需要执行一些复杂的SQL,需要用到Mybatis,但是数据源又是变化的,这个时候就要支持动态数据源。

    public SqlSession getSqlSession(String id) {
        DataSource dataSource = getDataSource(id);
        try {
            SqlSessionFactory sqlSessionFactory = sqlSessionFactory(dataSource);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            return sqlSession;
        } catch (Exception e) {
            log.error("getSqlSession failed.", e);
            throw new GlobalException(RespEnum.DATASOURCE_GET_SESSION_FAILED.getMsg());
        }
    }

    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        Configuration configuration = new Configuration();
        configuration.setJdbcTypeForNull(JdbcType.VARCHAR);
        configuration.setCallSettersOnNulls(true);
        factoryBean.setConfiguration(configuration);
        //设置mapper
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        //设置数据源
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

测试

SqlSession sqlSession = dataSourceManager.getSqlSession(datasourceId);
CommonDao commonDao = sqlSession.getMapper(CommonDao.class);