(ShardingSphere-JDBC)+(Mybatis)-springboot/快速搭建

阿丹:快速搭建快速使用

希望可以快速完成,可粘贴方式的快速搭建

ShardingSphere-JDBC

pom依赖

XML 复制代码
<!-- ShardingSphere JDBC核心依赖 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.1.1</version>
        </dependency>
       <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.1.1</version>
        </dependency>
<!-- Myabtis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
<!-- spring-web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.4</version>
        </dependency>
<!-- 如果你的项目中使用了MySQL数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>

ShardingSphere-JDBC :: ShardingSphereApache ShardingSphere Documenthttps://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/文档

application.yml配置文件

XML 复制代码
spring:
  shardingsphere: # Shardingsphere核心配置项
    datasource: # 数据源配置
      names: ds2024,ds2025
      # 定义数据源名称列表,此处只列出2024年和2025年的数据源作为示例

      # 配置2024年的数据库数据源
      ds2024:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/chicklogin_record_2024?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&autoReconnect=true
        username: root
        password: lianlu123

      ds2025:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/chicklogin_record_2025?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&autoReconnect=true
        username: root
        password: lianlu123

    sharding: # 分片配置
      default-database-strategy: # 默认数据库分片策略
        standard: # 标准分片策略
          sharding-column: ds # 分片依据的字段名(这里假设record_date为年份)
          precise-algorithm-class-name: com.XXX.oneclick.config.YearBasedDatabaseShardingAlgorithm # 指定用于分片的数据库策略算法类名


      tables: # 表级别的分片配置
        chick_record: # 需要分片的逻辑表名
          actual-data-nodes: ds$->{2024..2025}.chick_record_$->{0101..1231} # 物理表分布情况,根据年份和日期进行分库分表
          table-strategy: # 表级别分片策略
            standard: # 标准表分片策略
              sharding-column: cdate # 分片依据的字段名(这里假设record_date包含日期信息)
              precise-algorithm-class-name: com.XXX.oneclick.config.CustomDateTableShardingAlgorithm # 指定用于精确分片的表策略算法类名 --详细
              range-algorithm-class-name: com.XXX.oneclick.config.CustomDateTableRangeShardingAlgorithm #粗略按照天来分
          database-strategy:
            standard:
              sharding-column: cdate # 分片依据的字段名(这里假设record_date为年份)
              precise-algorithm-class-name: com.XXX.oneclick.config.YearBasedDatabaseShardingAlgorithm
          key-generator: # 主键生成策略
            type: SNOWFLAKE # 使用Snowflake算法作为主键生成器
            column: id # 主键列名

分表分库实现类:

在Apache ShardingSphere(包括Sharding-JDBC和Sharding-Proxy)中,RangeTableShardingAlgorithmPreciseShardingAlgorithm 是两种不同的分片算法接口,它们分别用于处理不同的分片场景。

  1. PreciseShardingAlgorithm

    • 该算法用于处理精确分片场景,即当SQL查询条件能够明确确定目标数据所在的分片时。例如,根据用户ID分表,查询时根据某个具体的用户ID决定数据应落在哪一张子表上。实现此类接口时,需要提供一个方法,它接受一个精确值并返回对应的数据库表名。
  2. RangeTableShardingAlgorithm

    • 此算法用于处理范围分片场景,即当SQL查询条件是一个范围时,需要确定哪些分片可能包含符合条件的数据。例如,根据订单时间在一个时间区间内的订单记录分布于多张表中,此时就需要根据时间范围来决定哪些表会被涉及。实现此类接口时,方法需要接收一个范围值,并返回可能包含匹配数据的所有数据库表名。

总结来说,PreciseShardingAlgorithm处理单个精确值的分片,而RangeTableShardingAlgorithm处理连续区间值的分片。在实际使用时,根据业务场景和分片策略的需求选择合适的分片算法来实现。在您给出的配置中,CustomDateTableShardingAlgorithm是用来实现表级别的精确分片,而如果是根据时间范围查询,则可能需要实现RangeTableShardingAlgorithm来处理这种类型的查询。

复制代码
粗略分按照天

分表策略:

java 复制代码
package com.XXXX.oneclick.config;

import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.*;

/**
 * 粗略分按照天
 */
@Configuration
public class CustomDateTableRangeShardingAlgorithm implements RangeShardingAlgorithm<Date> {
    public CustomDateTableRangeShardingAlgorithm() {
    }

    @Override
//    @Bean
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> shardingValue) {
        List<String> result = new ArrayList<>();
        // 根据rangeShardingValue.getValueRange()获取范围内的起始和结束日期
        Date startDate = shardingValue.getValueRange().lowerEndpoint();
        Date endDate = shardingValue.getValueRange().upperEndpoint();

        // 将范围内的每个日期转换为相应的表名并加入结果集
        while (!startDate.after(endDate)) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startDate);

            // 修正月份和日期的获取方式
            String month = String.format("%02d", calendar.get(Calendar.MONTH) + 1); // 注意月份需要+1,因为Java的月份是从0开始的
            String day = String.format("%02d", calendar.get(Calendar.DAY_OF_MONTH));
            String monthDay = month + day;

            result.add("chick_record_" + monthDay);

            // 更新startDate以便进入下一个日期
            calendar.add(Calendar.DATE, 1);
            startDate = calendar.getTime();
        }

        return result;
    }
}
java 复制代码
package com.lianlu.oneclick.config;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

/**
 * 按照天分表--详细分篇
 *
 */
// CustomDateTableShardingAlgorithm.java
@Configuration
public class CustomDateTableShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
    public CustomDateTableShardingAlgorithm() {
    }

    @Override
//    @Bean
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
        // 根据record_date字段提取年月日,并将其转换为相应的表名
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(shardingValue.getValue());

        // 月份加1是因为Java的Calendar月份是从0开始的,而我们想要的是1-12的格式
        String month = String.format("%02d", calendar.get(Calendar.MONTH) + 1);
        String day = String.format("%02d", calendar.get(Calendar.DAY_OF_MONTH));

        String monthDay = month + day;
        return "chick_record_" + monthDay;
    }
}

分库策略:

java 复制代码
package com.XXXX.oneclick.config;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

/**
 * 数据库配置
 * 按照年分库
 */
// YearBasedDatabaseShardingAlgorithm.java
@Configuration
public class YearBasedDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
        // 直接从shardingValue.getValue()中获取年份
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(shardingValue.getValue());

        int year = calendar.get(Calendar.YEAR);
        return "ds" + year;
    }
}

mybaits:

多数据源:

http://t.csdnimg.cn/EOWUE

单数据源:

mapper模板

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="">

</mapper>
相关推荐
尘浮生14 分钟前
Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
程序员阿龙22 分钟前
基于微信小程序的校园二手交易平台设计与实现,微信小程序(定制+讲解+咨询)校园二手商品在线交易系统、校园二手市场管理与推荐工具、智能化商品交易与推荐平台
spring boot·微信小程序·毕业设计·在线商品交易与搜索优化平台·在线二手商品交易与支付平台·商品管理与交易评价平台·二手商品分类与交易管理系统
苹果酱05675 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
feilieren6 小时前
信创改造 - TongRDS 替换 Redis
java·spring boot·后端
hani19906 小时前
beikeshop 与swoole结合,让网站打开飞起
后端·swoole
knoci6 小时前
【Go】-go中的锁机制
后端·学习·golang
Mike_188702783517 小时前
深入探索Golang的GMP调度机制:源码解析与实现原理
开发语言·后端·golang
不7夜宵7 小时前
Golang 反射
开发语言·后端·golang
AskHarries7 小时前
Spring Cloud Consul实现选举机制
java·后端·spring cloud·consul
山山而川粤7 小时前
大连环保公益管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·后端·学习·mysql