shardingJDBC分表

pom.xml

        <!-- 数据库分片 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.1.1</version>
        </dependency>

 

application.yml

spring:
  shardingsphere:
    props:
      sql-show: true
    datasource:
      names: db0
      db0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
    rules:
      sharding:
        key-generators:
          alg-snowflake:
            type: SNOWFLAKE
        sharding-algorithms:
          table-inline:
            type: CLASS_BASED
            props:
              strategy: STANDARD
              algorithmClassName: com.common.log.sharding.TableShardingAlgorithm
        tables:
          t_log:
            # 主键:分布式序列
            key-generate-strategy:
              column: id
              key-generator-name: alg-snowflake
            # 节点
            actual-data-nodes: db0.t_log_$->{2025..2026}
            # 分表策略
            table-strategy:
              standard:
                sharding-column: create_time
                sharding-algorithm-name: table-inline


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 

TableShardingAlgorithm.java

package com.order.log.sharding;

import cn.hutool.core.collection.ListUtil;
import com.google.common.collect.Range;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;

import java.time.LocalDateTime;
import java.util.Collection;

public class TableShardingAlgorithm implements StandardShardingAlgorithm<LocalDateTime> {

    @Override
    public void init() {}

    @Override
    public String getType() {
        return "CLASS_BASED";
    }

    /**
     * 精确增删改查 create_time
     **/
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<LocalDateTime> shardingValue) {
        int year = shardingValue.getValue().getYear();
        return "t_log_" + year;
    }

    /**
     * 范围增删改查 create_time
     **/
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<LocalDateTime> shardingValue) {
        // 可选实现范围查询逻辑
        Range<LocalDateTime> valueRange = shardingValue.getValueRange();
        LocalDateTime startDate = valueRange.lowerEndpoint();
        LocalDateTime endDate = valueRange.upperEndpoint();
        return ListUtil.of("t_log_" + startDate.getYear(), "t_log_" + endDate.getYear());
    }
}

 

测试

LogEntity

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 日志表
 **/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_log")
public class LogEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    //是否配置sharding-jdbc的分布式序列 ? 是:使用ShardingJDBC的分布式序列,否:自动依赖数据库的主键自增策略
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;

    @TableField("log_param")
    private String logParam;

    @TableField("log_result")
    private String logResult;

    @TableField("create_time")
    private LocalDateTime createTime;

}

LogDTO

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

/**
 * 日志表-入参
 **/
@Getter
@Setter
public class LogDTO {
    private Long id;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
}

LogController

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.iyungu.log.entity.LogDTO;
import com.iyungu.log.entity.LogEntity;
import com.iyungu.log.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.List;

@RequestMapping("logs")
@RestController
public class LogController {
    @Autowired
    private LogService logService;

    @PostMapping("save")
    public void save(@RequestBody LogEntity logEntity) {
        logEntity.setCreateTime(LocalDateTime.now());
        logService.save(logEntity);
    }

    @PostMapping("save2")
    public void save2(@RequestBody LogEntity logEntity) {
        logEntity.setCreateTime(LocalDateTime.now().plusYears(1));
        logService.save(logEntity);
    }

    @PostMapping("detail")
    public LogEntity detail(@RequestBody LogDTO req) {
        return logService.getById(req.getId());
    }

    @PostMapping("list")
    public List<LogEntity> list(@RequestBody LogDTO req) {
//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        LocalDateTime createTime = LocalDateTime.parse(req.getCreateTime(), formatter);
        return logService.list(Wrappers.lambdaQuery(LogEntity.class)
//                .eq(LogEntity::getCreateTime, req.getCreateTime())
                .between(LogEntity::getCreateTime, req.getStartTime(), req.getEndTime())
        );
    }

}

 

 
posted @ 2025-06-12 14:30  Peter.Jones  阅读(21)  评论(0)    收藏  举报