(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>
相关推荐
掘金者阿豪10 小时前
Let‘s Encrypt 证书到底会不会自动续期?从一次服务器迁移后的证书排查说起
后端
Meta3910 小时前
Java八股文之Spring Boot中解决Redis和MySQL的数据一致性问题
java·spring boot·redis
joinwell5210 小时前
Agent 中断后,原任务如何安全接管?从恢复标记到效果事实
人工智能·后端·架构
sp4210 小时前
羽量级的 Java Bean 实体校验器
后端
魔兽大山哥10 小时前
【NL2SQL 实战 07】LIMIT 不是小事:默认 100 行背后的产品判断
后端
qq_3391911410 小时前
go cpu占比高排查,cpu100%排查,go pprof cpu命令
开发语言·后端·golang
笃行35010 小时前
异构数据同步如何真正做到“数据无忧“?——解读 KFS 的全周期一致性校验与修复能力
后端
云边有个稻草人10 小时前
异构数据同步如何保证数据不出错:KFS全周期校验与修复实践
后端
JaguarJack11 小时前
现在就值得尝试的 5 个 Laravel 新包
后端·php·laravel·服务端
BingoGo11 小时前
现在就值得尝试的 5 个 Laravel 新包
后端·php