分表配置
再yml文件中,jdbc数据库连接下面,可以配置分表策略,其中的{0..15}是配置分表的数量。
并且在最后与配置文件 StationTableShardingConfig绑定
sharding:
tables:
t_station:
actual-data-nodes: ds${0}.t_station${0..15}
logic-table: t_station
table-strategy:
standard:
sharding-column: org_station_no
precise-algorithm-class-name: cn.nhd.freshgo.delivery.config.StationTableShardingConfig
最后面进行绑定表,在启动的时候就可以生效
binding-tables:
- t_station
配置文件StationTableShardingConfig
实现类PreciseShardingAlgorithm<String>,重写其中的doSharding方法。可以自定义分表策略。个人分表策略为生成的订单后三位的随机数来作为分表策略
@Slf4j
public class StationDelyItemTableShardingConfig implements PreciseShardingAlgorithm<String> {
private static final String TABLE_PREFIX = "t_station";
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
String orgStationNo = preciseShardingValue.getValue();
int num = Integer.parseInt(orgStationNo.substring(orgStationNo.length() - 3));
return TABLE_PREFIX + "_" + num;
}
此时启动项目的时候,会读到分表策略,查询的时候会自动进行分表查询,不需要在mapper中自己分表查询,按照未分表的方式就可以进行查询。
分表之后的条件查询
由于分表之后,系统默认会按照分表策略进行分表查询,如果查询的时候没有输入数字或者说输入的数字部分和自定义的分表策略,就可能会报出查不出表的sql错误。这时候就需要读取配置文件,并且在代码中进行一个格式判断。
SpringBootShardingRuleConfigurationProperties shardingDataSource =
ApplicationContextUtil.getBean(SpringBootShardingRuleConfigurationProperties.class);
取出配置文件中的自己的表,得到分表策略,就是配置文件中的ds${0}.t_station${0..15} 这一串,最后进行一系列的拆分获取数字,得到自己想要的判断方式,验证是否进行查询。
private Boolean checkTableNumber(String deliveryNo){
if(deliveryNo.length()<3){
return false;
}
SpringBootShardingRuleConfigurationProperties shardingDataSource = ApplicationContextUtil.getBean(SpringBootShardingRuleConfigurationProperties.class);
String tableNumber =shardingDataSource.getTables().get("t_delivery_order").getActualDataNodes();
String regEx="[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(tableNumber);
String table =m.replaceAll("");
Integer tableQuantity = Integer.parseInt(table.replaceFirst("^0*", ""));
if(!StringUtils.isNumeric(deliveryNo.substring(deliveryNo.length() - 3))){
return false;
}
int num = Integer.parseInt(deliveryNo.substring(deliveryNo.length() - 3));
if(num >tableQuantity){
return false;
}
return true;
}