SharedingJDBC4.0实现按月分片demo

1.demo实现功能

这里实现了按月分表的新增,修改和范围查询功能,没有实现分库功能。

完整下载地址:  https://download.csdn.net/download/ganjing222/87794697

2.pom文件

<!-- sharding-jdbc-spring-namespace -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>

3.yml文件配置 

spring:
  shardingsphere:
    #配置数据源
    datasource:
      names: ds-master
      ds-master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        #url: jdbc:mysql://192.168.163.128:3306/shardingjdbcdb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
        url: jdbc:mysql://127.0.0.1:3306/sharedingdemo?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
        username: root
        password: 123456
    sharding:
      tables:
        user:
          #配置真实表分布 t_log_$->{2022..2100}0$->{1..9},ds.t_log_$->{2022..2100}1$->{0..2}
          #t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2}
          actual-data-nodes: ds-master.user_$->{2023..2023}0$->{1..9},ds-master.user_$->{2023..2023}1$->{0..2}  #0..1 从0到1
          tableStrategy:
            standard:
              sharding-column: create_time
              #定义精准分片算法
              precise-algorithm-class-name: cn.itcloud.sharedingjdbc.algorithm.MyTableRangeShardingAlgorithm
              #定义范围分片算法
              range-algorithm-class-name: cn.itcloud.sharedingjdbc.algorithm.MyTableRangeShardingAlgorithm

4. 自定义分片算法实现

@Slf4j
public class MyTableRangeShardingAlgorithm implements PreciseShardingAlgorithm<String>,RangeShardingAlgorithm<String> {
    /**
     *  根据传入的分片健的值,对所有待选择的表中 根据自己的业务逻辑进行判断,选择符合条件的表返回
     * @param tableNameList 返回需要查询的表
     * @param shardingValue 传入的分片健的值
     * @return 返回符合条件的表名称
     */
    @Override
    public Collection<String> doSharding(Collection<String> tableNameList, RangeShardingValue<String> shardingValue) {

        System.out.println("[MyTableRangeShardingAlgorithm] shardingValue: [{}]\n"+ shardingValue);
        Set<String> tableNameResultList = new LinkedHashSet<>();
        Range<String> rangeValue = shardingValue.getValueRange();

        int lowInt = Integer.valueOf(rangeValue.lowerEndpoint().substring(0,7).replaceAll("-",""));
        int upperInt = Integer.valueOf(rangeValue.upperEndpoint().substring(0,7).replaceAll("-",""));

        for (String tableNameItem : tableNameList) {
            String substring = tableNameItem.substring(tableNameItem.length() - 6,tableNameItem.length());
            int tableItem = Integer.valueOf(substring);
            if(tableItem >=  lowInt && tableItem <= upperInt ){
                tableNameResultList.add(tableNameItem);
            }

        }
        return tableNameResultList;
    }
    /**
     * 构建分片后的表名
     * @param logicTableName
     * @param date
     * @return
     */
    private String buildShardingTable(String logicTableName, String date) {
        StringBuffer stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4)
                .append(date, 5, 7);
        return stringBuffer.toString();
    }

    /**
     * 精准分片算法
     * @param collection
     * @param preciseShardingValue
     * @return
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        String s = buildShardingTable(preciseShardingValue.getLogicTableName(), preciseShardingValue.getValue());
        return s;
    }
}

5:数据库对应表名

 

完整的demo地址:    https://download.csdn.net/download/ganjing222/87794697

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值