(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>
相关推荐
Channing Lewis40 分钟前
flask常见问答题
后端·python·flask
Channing Lewis42 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
呼啦啦啦啦啦啦啦啦2 小时前
【Redis】持久化机制
java·redis·mybatis
!!!5258 小时前
日志技术-LogBack入门程序&Log配置文件&日志级别
spring boot
Ai 编码助手9 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花9 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
Channing Lewis9 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask
轩辕烨瑾10 小时前
C#语言的区块链
开发语言·后端·golang
feilieren11 小时前
SpringBoot 搭建 SSE
java·spring boot·spring
苏-言11 小时前
MyBatis最佳实践:动态 SQL
数据库·sql·mybatis