Springboot+Mybatis+mysql分包方式配置多數據源

多數據源配置主要是有兩種配置方式,一種是分包方式,另一種是通過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多數據源事務處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章