下面记录一下单数据源的自动配置、使用Bean配置方式和多数据源配置与事务管理器扩配置。
单数据源配置
这里选用的是druid作为数据源,下面是Mysql驱动和druid数据池依赖
pom.xml包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency>
数据池的选用和数据库的配置
application.yml配置文件
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8 username: root password: root
最后在启动类中进行mapper包的扫描
@MapperScan("com.example.springbootmysql01") @SpringBootApplication public class SpringbootMysql01Application { public static void main(String[] args) { SpringApplication.run(SpringbootMysql01Application.class, args); } }
使用bean方式配置数据源
数据库的配置
sql.properties配置文件
mysql.driver-class-name=com.mysql.cj.jdbc.Driver mysql.url=jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8 mysql.username=root mysql.password=root
使用配置类配置数据源
@Configuration @PropertySource(value = "classpath:sql.properties") public class DataSourceConfig { @Value("${mysql.driver-class-name}") private String driverClassName; @Value("${mysql.url}") private String url; @Value("${mysql.username}") private String username; @Value("${mysql.password}") private String password; @Bean public DataSource setDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
配置二,使用DataSourceBuilder方式构建数据源
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8 username: root password: root
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSourceDb1() { return DataSourceBuilder.create().type(DruidDataSource.class).build(); } }
- 配置多数据源
在配置文件配置多个数据源地址
spring: datasource-db1: url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8 driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root datasource-db2: url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8 driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root
初始化数据源和事务管理器
@Configuration public class DatasourceConfig { /** * 数据源1 * @return */ @Bean(name = "DataSources.DB1") @ConfigurationProperties(prefix = "spring.datasource-db1") public DataSource dataSourceDb1() { return DataSourceBuilder.create().type(DruidDataSource.class).build(); } /** * 数据源2 * @return */ @Bean(name = "DataSources.DB2") @ConfigurationProperties(prefix = "spring.datasource-db2") public DataSource dataSourceDb2() { return DataSourceBuilder.create().type(DruidDataSource.class).build(); } /** * 事务管理器1 * @param dataSource 数据源1 * @return */ @Primary @Bean("transactionManager.DB1") public DataSourceTransactionManager transactionManagerDB1(@Qualifier("DataSources.DB1") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 事务管理器2 * @param dataSource 数据源1 * @return */ @Bean("transactionManager.DB2") public DataSourceTransactionManager transactionManagerDB2(@Qualifier("DataSources.DB2") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
配置查询使用的SqlSessionFactoryBean
数据源一
配置com.example.springbootmysql03.mapper.db1包下使用sqlSessionFactoryBean.DB1数据源工厂
@Configuration @MapperScan(value = "com.example.springbootmysql03.mapper.db1", sqlSessionFactoryRef = "sqlSessionFactoryBean.DB1") public class MyBatisDB1Config { @Autowired @Qualifier("DataSources.DB1") private DataSource dataSource; @Bean("sqlSessionFactoryBean.DB1") public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean; } }
数据源二
配置com.example.springbootmysql03.mapper.db2包下使用sqlSessionFactoryBean.DB2数据源工厂
@Configuration @MapperScan(value = "com.example.springbootmysql03.mapper.db2", sqlSessionFactoryRef = "sqlSessionFactoryBean.DB2") public class MyBatisDB2Config { @Autowired @Qualifier("DataSources.DB2") private DataSource dataSource; @Bean("sqlSessionFactoryBean.DB2") public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean; } }
注意:在sqlsessionFactoryBean中可以配置加载xml配置文件
// 解决配置到配置文件中通过*配置找不到mapper文件的问题。 如果不设置这一行,在配置文件中,只能使用数组的方式一个个的罗列出来,并且要指定具体的文件名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper_db2/*.xml"));
不同数据源事务管理器的使用
@SpringBootTest class SpringbootMysql03ApplicationTests { @Resource private User1Mapper user1Mapper; @Resource private User2Mapper user2Mapper; @Test @Transactional(transactionManager = "transactionManager.DB1") void testDB1() { System.out.println(user1Mapper.get()); } @Test @Transactional(transactionManager = "transactionManager.DB2") void testDB2() { System.out.println(user2Mapper.get()); } }
完!