多數據源配置主要是有兩種配置方式,一種是分包方式,另一種是通過AOP實現,本篇主要講通過分包方式來實現多數據源配置。
一、添加項目依賴
<!-- mybatis start -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- mysql 驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- druid數據庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!--mybatis分頁插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
二、編寫application配置文件信息
本人使用的是.properties配置文件,yml的自定轉換格式,這裏以兩個庫爲例,有多少個庫就寫多少個數據源配置信息。
#執行mapper裏的接口後會打印出執行的sql語句
logging.level.com.boot.framework.mapper = debug
spring.datasource.userdb.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.userdb.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.userdb.jdbcUrl = jdbc:mysql://localhost:3306/db_user?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&serverTimezone=GMT%2B8
spring.datasource.userdb.username = root
spring.datasource.userdb.password = 123456
spring.datasource.userdb.validationQuery=SELECT 1
spring.datasource.userdb.testWhileIdle=true
spring.datasource.userdb.timeBetweenEvictionRunsMillis=300000
spring.datasource.userdb.numTestsPerEvictionRun=50
spring.datasource.userdb.minEvictableIdleTimeMillis=3600000
spring.datasource.admindb.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.admindb.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.admindb.jdbcUrl = jdbc:mysql://localhost:3306/db_admin?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&serverTimezone=GMT%2B8
spring.datasource.admindb.username = root
spring.datasource.admindb.password = 123456
spring.datasource.admindb.validationQuery=SELECT 1
spring.datasource.admindb.testWhileIdle=true
spring.datasource.admindb.timeBetweenEvictionRunsMillis=300000
spring.datasource.admindb.numTestsPerEvictionRun=50
spring.datasource.admindb.minEvictableIdleTimeMillis=3600000
三、數據源配置文件
一個數據源一個配置文件,這裏列舉出一個完整的配置例子,不同的數據源只需要更改bean名稱以及路徑即可。
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@MapperScan(basePackages = UserDatasource.PACKAGE, sqlSessionTemplateRef = "userdb")
public class UserDatasource {
// 精確到 mapper 目錄,以便跟其他數據源隔離
static final String PACKAGE = "com.boot.framework.mapper.userdb";
static final String MAPPER_LOCATION = "classpath:mapping/userdb/*.xml";
@Bean(name = "userdbDatasource")
@ConfigurationProperties(prefix = "spring.datasource.userdb")
@Primary //標記爲主數據源,當數據源不確定時會默認選擇主數據源,必須並只能在一個文件中使用該註解
public DataSource textDatasource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "userSqlSessionFactory")
@Primary
public SqlSessionFactory textSessionFactory(@Qualifier("userdbDatasource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(UserDatasource.MAPPER_LOCATION));
//分頁攔截器-start 添加分頁插件,若無該需求可不配置
Interceptor[] plugins = new Interceptor[]{pageHelper()};
bean.setPlugins(plugins);
// 分頁攔截器-end
return bean.getObject();
}
//事務管理
@Bean(name = "userTransactionManager")
public DataSourceTransactionManager userTransactionManager(@Qualifier("userdbDatasource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "userdb")
@Primary
public SqlSessionTemplate textSessionTemplat(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
//分頁插件配置
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
p.setProperty("returnPageInfo", "check");
p.setProperty("params", "count=countSql");
pageHelper.setProperties(p);
return pageHelper;
}
}
因爲使用了分頁插件,所以就簡單的舉例來說明一下如何使用吧
是的,只需要在調用mapper接口前使用
PageHelper.startPage(“第幾頁”,“一頁多少條數據”);
這時分頁插件會自動攔截到下一次執行的sql,並動態的加上limit關鍵字,如:
如此配置基本就完成了,接下來可以通過 mybatis逆向工程 將model、mapper、xml文件生成出來。
至於多數據源事務問題可查看Springboot通過AOP多數據源事務處理