Springboot+MybatisPlus+ShardingSphere完整整合

1.項目結(jié)構(gòu)

主要結(jié)構(gòu)

Springboot 2.7.5

Redis

MyBatisPlus 3.5.3.1

MyBatisPlusJoin 1.4.5

ShardingSphere 5.1.2

2.maven引入

特別注意: springboot 2.7.5 和shardingsphere 5.1.2

?(1)springboot版本


<parent>?

? ? <groupId>org.springframework.boot</groupId>?

? ? <artifactId>spring-boot-starter-parent</artifactId>?

? ? <version>2.7.5</version>?

</parent>


?(2)maven插件

<!-- 開始 shardingsphere 5.1.2版本分庫分表? -->?

<dependency>?

? ? <groupId>org.apache.shardingsphere</groupId>?

? ? <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>?

? ? <version>5.1.2</version>?

</dependency>?

<dependency>?

? ? <groupId>org.springframework.boot</groupId>?

? ? <artifactId>spring-boot-starter-jdbc</artifactId>?

</dependency>?

<dependency>?

? ? <groupId>org.springframework.boot</groupId>?

? ? <artifactId>spring-boot-configuration-processor</artifactId>

? ? <optional>true</optional>?

</dependency>?

<dependency>?

? ? <groupId>com.baomidou</groupId>?

? ? <artifactId>dynamic-datasource-spring-boot-starter</artifactId>?

? ? <version>3.3.2</version>?

</dependency>?

<dependency>?

? ? <groupId>org.springframework.boot</groupId>?

? ? <artifactId>spring-boot-starter</artifactId>?

? ? <!-- 由于Mybatis Plus使用了druid作為默認的數(shù)據(jù)源,分庫分表使用的是HikariDataSource作為數(shù)據(jù)源管理,所以需要排除druid的starter -->?

? ? <exclusions>?

? ? ? ? <exclusion>? ? ? ? ?

? ? ? ? <groupId>com.alibaba</groupId>?

? ? ? ? ? ? <artifactId>druid-spring-boot-starter</artifactId>?

? ? ? ? </exclusion>?

? ? </exclusions>

</dependency>?

<!-- 結(jié)束 shardingsphere 5.1.2版本分庫分表? -->

... 其他內(nèi)容

?3. yml文件配置

*? 放的獨立的環(huán)境配置文件中,如test,prod等

* 如 application-test.yml

# 開發(fā)環(huán)境?

spring:?

? # redis配置?

? redis:?

? ? host: xxx.xxx.xxx.xxx?

? ? port: 6379?

? ? timeout: 120000 # 連接超時時間(毫秒)?

? ? password: xxx #密碼?

? ? database: 0 #Redis數(shù)據(jù)庫索引0-255其中一個,默認0?

? ? jedis:?

? ? ? pool:?

? ? ? ? max-active: 50? #連接池最大連接數(shù)(使用負值表示沒有限制)?

? ? ? ? max-idle: 50? # 連接池中的最大空閑連接?

? ? ? ? min-idle: 10? # 連接池中的最小空閑連接?

? ? ? ? max-wait: 2000 # 連接池最大阻塞等待時間(使用負值表示沒有限制)?

? ? ? ? time-between-eviction-runs: 60000?


? # 分表數(shù)據(jù)庫配置?

? shardingsphere:?

? ? enabled: true?

? ? props:?

? ? ? sql-show: true?

? ? datasource:?

? ? ? names: master?

? ? ? master:?

? ? ? ? type: com.zaxxer.hikari.HikariDataSource?

? ? ? ? driver-class-name: com.mysql.cj.jdbc.Driver?

? ? ? ? jdbcUrl: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8?

? ? ? ? url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8?

? ? ? ? username: root?

? ? ? ? password: root?

? ? rules:?

? ? ? sharding:?

? ? ? ? sharding-algorithms:?

? ? ? ? ? # 自定義分庫算法-此處為單庫不需要分庫?

? ? ? ? ? db-strategy-algorithms-default:?

? ? ? ? ? ? type: INLINE?

? ? ? ? ? ? props:?

? ? ? ? ? ? ? algorithm-expression: master?

? ? ? ? ? # 自定義分表算法-按照月份分表?

? ? ? ? ? table-strategy-algorithms-month:?

? ? ? ? ? ? type: INTERVAL?

? ? ? ? ? ? props:?

? ? ? ? ? ? ? datetime-pattern: yyyy-MM-dd HH:mm:ss?

? ? ? ? ? ? ? datetime-lower: 2023-01-01 00:00:00?

? ? ? ? ? ? ? datetime-upper: 2030-12-31 23:59:59?

? ? ? ? ? ? ? sharding-suffix-pattern: yyyyMM? # 月份作為后綴?

? ? ? ? ? ? ? datetime-interval-amount: 1?

? ? ? ? ? ? ? datetime-interval-unit: MONTHS?

? ? ? ? tables:?

? # t_order 表分片規(guī)則?

? t_order:?

? ? actual-data-nodes: master.t_order_$->{2024..2030}0$->{1..9},master.t_order_$->{2024..2030}1$->{0..2}?

? ? database-strategy:?

? ? ? standard:?

? ? ? ? sharding-column: id?

? ? ? ? sharding-algorithm-name: db-strategy-algorithms-default?

? ? table-strategy:?

? ? ? standard:?

? ? ? ? sharding-column: work_date?

? ? ? ? sharding-algorithm-name: table-strategy-algorithms-month?

? ? key-generate-strategy:?

? ? ? column: id?

? ? ? key-generator-name: my-snowflake

? ? broadcast-tables:?

? ? ? - t_order?

key-generators:?

? my-snowflake:?

? ? type: SNOWFLAKE


?4.數(shù)據(jù)源配置

package com.expamle.admin.config;?

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;?

import com.baomidou.dynamic.datasource.creator.DataSourceCreator;?

import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;?

import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;?

import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;?

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;?

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;?

import org.apache.shardingsphere.driver.jdbc.adapter.AbstractDataSourceAdapter;?

import org.springframework.beans.factory.annotation.Value;?

import org.springframework.boot.SpringBootConfiguration;?

import org.springframework.boot.autoconfigure.AutoConfigureBefore;?

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;?

import org.springframework.boot.context.properties.EnableConfigurationProperties;?

import org.springframework.context.annotation.Bean;?

import org.springframework.context.annotation.Configuration;?

import org.springframework.context.annotation.Lazy;?

import org.springframework.context.annotation.Primary;?


import javax.annotation.Resource;?

import javax.sql.DataSource;?

import java.util.Arrays;?

import java.util.HashMap;?

import java.util.List;?

import java.util.Map;?


/**?

* shardingSphere 分庫分表插件引入后所需的配置內(nèi)容 */@Configuration?

@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})?

@EnableConfigurationProperties(DynamicDataSourceProperties.class)?

public class ShardingSphereDataSourceConfig {?

? ? @Resource?

? ? private DynamicDataSourceProperties dynamicDataSourceProperties;?


? ? @Lazy?

? ? @Resource?

? ? private AbstractDataSourceAdapter shardingSphereDataSource;?


? ? @Value("${spring.shardingsphere.datasource.names}")?

? ? private String dataSourceNames;?


? ? @Primary?

? ? @Bean?

? ? @ConditionalOnMissingBean?

? ? public DefaultDataSourceCreator defaultDataSourceCreator(List<DataSourceCreator> dataSourceCreators) {?

? ? ? ? DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator();?

? ? ? ? defaultDataSourceCreator.setCreators(dataSourceCreators);?

? ? ? ? defaultDataSourceCreator.setProperties(dynamicDataSourceProperties);?

? ? ? ? return defaultDataSourceCreator;?

? ? }?


? ? @Bean?

? ? public DynamicDataSourceProvider dynamicDataSourceProvider() {?

? ? ? ? String[] names = dataSourceNames.split(",");?

? ? ? ? return new AbstractDataSourceProvider() {?

? ? ? ? ? ? @Override?

? ? ? ? ? ? public Map<String, DataSource> loadDataSources() {?

? ? ? ? ? ? ? ? Map<String, DataSource> dataSourceMap = new HashMap<>();?

? ? ? ? ? ? ? ? Arrays.stream(names).forEach(name -> dataSourceMap.put(name, shardingSphereDataSource));?

? ? ? ? ? ? ? ? return dataSourceMap;?

? ? ? ? ? ? }?

? ? ? ? };?

? ? }?


? ? @Primary?

? ? @Bean?

? ? public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {?

? ? ? ? DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();?

? ? ? ? dataSource.setPrimary(dynamicDataSourceProperties.getPrimary());?

? ? ? ? dataSource.setStrict(dynamicDataSourceProperties.getStrict());?

? ? ? ? dataSource.setStrategy(dynamicDataSourceProperties.getStrategy());?

? ? ? ? dataSource.setProvider(dynamicDataSourceProvider);?

? ? ? ? dataSource.setP6spy(dynamicDataSourceProperties.getP6spy());?

? ? ? ? dataSource.setSeata(dynamicDataSourceProperties.getSeata());?

? ? ? ? return dataSource;?

? ? }?

}

?5.MybatisPlusConfig

package com.expamle.admin.config;?


import com.baomidou.mybatisplus.annotation.DbType;?

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;?

import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;?

import org.springframework.context.annotation.Bean;?

import org.springframework.context.annotation.Configuration;?

import org.springframework.transaction.annotation.EnableTransactionManagement;?


import java.util.Collections;?


@EnableTransactionManagement?

@Configuration?

public class MybatisPlusConfig {?

? ? /**?

? ? * 分頁插件 3.5.X? ? *? ? * @author zhengkai.blog.csdn.net?

? ? */? ? @Bean?

? ? public PaginationInnerInterceptor paginationInnerInterceptor() {?

? ? ? ? PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();?

? ? ? ? // 設(shè)置最大單頁限制數(shù)量,默認 500 條,-1 不受限制?

? ? ? ? paginationInterceptor.setMaxLimit(-1L);?

? ? ? ? paginationInterceptor.setDbType(DbType.MYSQL);?

? ? ? ? // 開啟 count 的 join 優(yōu)化,只針對部分 left join?

? ? ? ? paginationInterceptor.setOptimizeJoin(true);?

? ? ? ? return paginationInterceptor;?

? ? }?


? ? @Bean?

? ? public MybatisPlusInterceptor mybatisPlusInterceptor() {?

? ? ? ? MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();?

? ? ? ? mybatisPlusInterceptor.setInterceptors(Collections.singletonList(paginationInnerInterceptor()));?

? ? ? ? return mybatisPlusInterceptor;?

? ? }?

}

?6.注意啟動類


@EnableAsync?

@SpringBootApplication(scanBasePackages = {"com.expamle.admin", "com.expamle.common"})?

@MapperScan("com.expamle.admin.sys.dao")?

public class AdminApplication {?

? ? public static void main(String[] args) {?

? ? ? ? SpringApplication.run(WhzzcgAdminApplication.class, args);?

? ? }?

}

?7.特別注意

1.在使用crate_time等日期數(shù)據(jù)生成分表建時,傳入查詢的格式一定要滿足 yyyy-MM-dd HH:mm:ss 格式才行,否則將報錯

2.如果在項目中已有了主表且數(shù)據(jù)非常多,則需要手動生成對應子表并將對應數(shù)據(jù)導入到子表,否則聯(lián)合查詢將會報錯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容