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())
);
}
}