Spring Boot MyBatis配置Druid多資料來源(附原始碼)
Spring Boot MyBatis配置Druid多資料來源
回顧在Spring中配置MyBatis SqlSessionFactory的配置:
<!-- mybatis 的SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
所以實際上在Spring Boot中配置MyBatis多資料來源的關鍵在於建立SqlSessionFactory的時候為其分配不同的資料來源。
引入依賴
oracle,mysql兩個依賴,當然也可以兩個或者多個mysql資料來源。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!-- oracle驅動 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>6.0</version> </dependency> <!-- mysql驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- druid資料來源驅動 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.6</version> </dependency>
在Spring Boot配置檔案application.yml中配置多資料來源和Spring Boot JdbcTemplate配置Druid多資料來源一致。
然後根據application.yml建立兩個資料來源配置類MysqlDatasourceConfig和OracleDatasourceConfig:
MysqlDatasourceConfig:
@Configuration @MapperScan(basePackages = MysqlDatasourceConfig.PACKAGE, sqlSessionFactoryRef = "mysqlSqlSessionFactory") public class MysqlDatasourceConfig { // mysqldao掃描路徑 static final String PACKAGE = "com.springboot.mysqldao"; // mybatis mapper掃描路徑 static final String MAPPER_LOCATION = "classpath:mapper/mysql/*.xml"; @Primary @Bean(name = "mysqldatasource") @ConfigurationProperties("spring.datasource.druid.mysql") public DataSource mysqlDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "mysqlTransactionManager") @Primary public DataSourceTransactionManager mysqlTransactionManager() { return new DataSourceTransactionManager(mysqlDataSource()); } @Bean(name = "mysqlSqlSessionFactory") @Primary public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqldatasource") DataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); //如果不使用xml的方式配置mapper,則可以省去下面這行mapper location的配置。 sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(MysqlDatasourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
上面程式碼配置了一個名為mysqldatasource的資料來源,對應application.yml中spring.datasource.druid.mysql字首配置的資料庫。然後建立了一個名為mysqlSqlSessionFactory的Bean,並且注入了mysqldatasource。與此同時,還分別定了兩個掃描路徑PACKAGE和MAPPER_LOCATION,前者為Mysql資料庫對應的mapper介面地址,後者為對應的mapper xml檔案路徑。
@Primary標誌這個Bean如果在多個同類Bean候選時,該Bean優先被考慮。多資料來源配置的時候,必須要有一個主資料來源,用@Primary標誌該Bean。
同理,接著配置Oracle資料庫對應的配置類:
OracleDatasourceConfig:
@Configuration
@MapperScan(basePackages = OracleDatasourceConfig.PACKAGE,
sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDatasourceConfig {
// oracledao掃描路徑
static final String PACKAGE = "com.springboot.oracledao";
// mybatis mapper掃描路徑
static final String MAPPER_LOCATION = "classpath:mapper/oracle/*.xml";
@Bean(name = "oracledatasource")
@ConfigurationProperties("spring.datasource.druid.oracle")
public DataSource oracleDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "oracleTransactionManager")
public DataSourceTransactionManager oracleTransactionManager() {
return new DataSourceTransactionManager(oracleDataSource());
}
@Bean(name = "oracleSqlSessionFactory")
public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracledatasource") DataSource dataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//如果不使用xml的方式配置mapper,則可以省去下面這行mapper location的配置。
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(OracleDatasourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
測試
配置完多資料來源,接下來分別在com.springboot.mysqldao路徑和com.springboot.oracledao路徑下建立兩個mapper介面:
MysqlStudentMapper:
package com.springboot.mysqldao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MysqlStudentMapper {
List<Map<String, Object>> getAllStudents();
}
OracleStudentMapper:
package com.springboot.oracledao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OracleStudentMapper {
List<Map<String, Object>> getAllStudents();
}
接著建立mapper介面對應的實現:
在src/main/resource/mapper/mysql/路徑下建立MysqlStudentMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.mysqldao.MysqlStudentMapper">
<select id="getAllStudents" resultType="java.util.Map">
select * from student
</select>
</mapper>
在src/main/resource/mapper/oracle/路徑下建立OracleStudentMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.oracledao.OracleStudentMapper">
<select id="getAllStudents" resultType="java.util.Map">
select * from student
</select>
</mapper>
ervice,Controller就不寫了,
原始碼地址:
連結:https://pan.baidu.com/s/16ULqcci9YWGpPlWx2FVg9A
提取碼:j6p1
複製這段內容後開啟百度網盤手機App,操作更方便哦