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);