与Mybatis整合很简单,只需要把数据源替换成自定义的动态数据源DynamicDataSource。
那么动态数据源如何注入到IOC容器中呢?看上文自定义的DynamicDataSource构造方法,肯定需要两个数据源了,因此必须先注入两个或者多个数据源到IOC容器中,如下:
/** * @Bean:向IOC容器中注入一个Bean * @ConfigurationProperties:使得配置文件中以spring.datasource为前缀的属性映射到Bean的属性中 */ @ConfigurationProperties(prefix = "spring.datasource") @Bean("dataSource") public DataSource dataSource(){ return new DruidDataSource(); } /** * 向IOC容器中注入另外一个数据源 * 全局配置文件中前缀是spring.datasource.his */ @Bean(name = SwitchSource.DEFAULT_NAME) @ConfigurationProperties(prefix = "spring.datasource.his") public DataSource hisDataSource() { return DataSourceBuilder.create().build(); }以上构建的两个数据源,一个是默认的数据源,一个是需要切换到的数据源(targetDataSources),这样就组成了动态数据源了。数据源的一些信息,比如url,username需要自己在全局配置文件中根据指定的前缀配置即可,代码不再贴出。
动态数据源的注入代码如下:
/** * 创建动态数据源的SqlSessionFactory,传入的是动态数据源 * @Primary这个注解很重要,如果项目中存在多个SqlSessionFactory,这个注解一定要加上 */ @Primary @Bean("sqlSessionFactory2") public SqlSessionFactory sqlSessionFactoryBean(DynamicDataSource dynamicDataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dynamicDataSource); org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setMapUnderscoreToCamelCase(true); configuration.setDefaultFetchSize(100); configuration.setDefaultStatementTimeout(30); sqlSessionFactoryBean.setConfiguration(configuration); return sqlSessionFactoryBean.getObject(); }