1、修改应用的入口
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class QuestionbanksystemApplication { public static void main(String[] args) { SpringApplication.run(QuestionbanksystemApplication.class, args); } }
这是因为 SpringBoot 会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时 SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除 DataSourceAutoConfiguration
的自动配置.
2、配置数据源
这里我们配置来两个数据源 一个是 first,一个 second,修改 application.yml
文件
spring: datasource: #druid相关配置 druid: first: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8 username: root password: xxx second: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai username: root password: xxx
3、完成数据源配置
这里需要完成 DataSource/SqlSessionFactory/SessionTemp 等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的 Bean 必须使用 @Primary
完成注解.
下面是两个数据源的配置,其中 First 使用了 @Primary 注解
MapperScan 注解的 basePackages 表示了其目录下的 Mapper 使用文件使用该数据源,如 FirstDataSource 中表示
"com.questionbanksystem.dao.test1
下的 Maper 文件将使用 FirstDataSource.
import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.questionbanksystem.dao.test1",sqlSessionTemplateRef ="firstSqlSessionTemplate") public class FirstDataSourceConfig { // 创建数据源 @Bean(name = "firstDS") //这里就是application.yml中配置的路径 @ConfigurationProperties(prefix = "spring.datasource.druid.first") @Primary public DataSource getFirstDataSource() { DataSource build = DataSourceBuilder.create() .driverClassName("com.mysql.jdbc.Driver") .url("jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8") .username("root") .password("xxx") .build(); return build; } // 创建SessionFactory @Bean(name = "firstSqlSessionFactory") @Primary public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //下面是配置mybatis驼峰命名规则自动转换 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session .Configuration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); return bean.getObject(); } // 创建事务管理器 @Bean("firstTransactionManger") @Primary public DataSourceTransactionManager firstTransactionManger(@Qualifier("firstDS") DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } // 创建SqlSessionTemplate @Bean(name = "firstSqlSessionTemplate") @Primary public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } private Class getType(String type) { try { return Class.forName(type); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
以及第二个数据源的配置
import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.questionbanksystem.dao.test2",sqlSessionTemplateRef ="secondSqlSessionTemplate") public class SecondDataSourceConfig { // 创建数据源 @Bean(name = "secondDS") //这里就是application.yml中配置的路径 @ConfigurationProperties(prefix = "spring.datasource.druid.second") public DataSource getSecondDataSource() { DataSource build = DataSourceBuilder.create() .driverClassName("com.mysql.jdbc.Driver") .url("jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&useSSL=false") .username("root") .password("xxx") .build(); return build; } // 创建SessionFactory @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //下面是配置mybatis驼峰命名规则自动转换 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session .Configuration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); return bean.getObject(); } // 创建事务管理器 @Bean("secondTransactionManger") public DataSourceTransactionManager secondTransactionManger(@Qualifier("secondDS") DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } // 创建SqlSessionTemplate @Bean(name = "secondSqlSessionTemplate") public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } private Class getType(String type) { try { return Class.forName(type); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
4、实现 Mapper
根据数据源配置的 MappScan 目录中的 basePackages 来创建 Mapper,注意包名,放在正确的位置上.
5、总结
其余的操作和单数据源时没有区别。重点:
- mapper 文件的地址,一定和数据源配置中 MappScan 目录中的 basePackages 一致。
- 驼峰式命名的转换。之前的配置是在
application.yml
中mybatis: configuration: map-underscore-to-camel-case: true
可是后来发现配置双数据源之后失效了,所以需要在两个数据源配置文件里都重新配置。
@Bean(name = "firstSqlSessionFactory") @Primary public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //下面是配置mybatis驼峰命名规则自动转换------ org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session .Configuration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); //----------------------------------------- return bean.getObject(); }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于