一.问题背景
临时接到任务,需要写一个导入excel的脚本,要校验用户提供的excel的内容是否符合条件。但是校验的数据需要从2个数据库中获取,可以通过接口的形式从两个数据库对应的应用中获取数据,但是过于麻烦,所以尝试使用spirngboot+mybitis对多个数据源进行操作。
二.项目创建并编写demo
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
项目结构图
配置文件yml
server:
port: 8080
spring:
datasource:
name: mysql_test
user:
jdbcurl: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
boss:
jdbcurl: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
(注意:springboot2.0 JDBC的 url 参数要变成 jdbcurl,参考以上)
BossDataSourceConfig:配置数据源,session工厂,事务管理器,session模板,mapper扫描
@Configuration
@MapperScan(basePackages = "com.levenx.mapper.boss", sqlSessionTemplateRef = "bossSqlSessionTemplate")
public class BossDataSourceConfig {
/**
* 配置数据数据源 boss
*
* @return
*/
@Bean(name = "bossDatasource")
@ConfigurationProperties(prefix = "spring.datasource.boss")
@Primary
public DataSource masterDatasource() {
return DataSourceBuilder.create().build();
}
/**
* 配置session工厂
*
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "bossSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("bossDatasource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:"));
return bean.getObject();
}
/**
* 配置事务管理器
*
* @param dataSource
* @return
*/
@Bean(name = "bossTransactionManger")
@Primary
public DataSourceTransactionManager masterTransactionManger(@Qualifier("bossDatasource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* session模版
*
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "bossSqlSessionTemplate")
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("bossSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
(UserDatasourceConfig 参考 BossDataSourceConfig,需要去掉 @Primary)
BossMapper:数据库映射
@Repository
public interface BossMapper {
@Select("select * from boss where user_id = #{userId}")
@Results(value = {@Result(column = "user_id",property = "userId"),
@Result(column = "zh_name",property = "zhName")})
public Boss findBossByUserId(@Param("userId") Integer userId);
}
至此配置已经完成了,已经实现了多数据源的操作使用。
demo用的是经典的mvc三层,controller,service,dao.