sharding-jdbc自定义查询(范围查询)案例&&查询时可能会踩的坑

前提

继上篇sharding-jdbc动态按天插入案例的代码之后,分库分表神器 Sharding-JDBC(按天分表案例)_明天一定.的博客-CSDN博客_shardingsphere按天分表https://blog.csdn.net/wai_58934/article/details/125238850?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166841466816782425123629%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166841466816782425123629&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-125238850-null-null.nonecase&utm_term=sharding&spm=1018.2226.3001.4450

有些小伙伴询问我。然后我重新审视了我的代码,发现我的解法是真的垃圾(不过是适用于其他一些场景,请依据场景而定),因为我的业务是当天的数据插入当天的表,每天一张表。这我用个毛的sharding-jdbc啊,直接用户给数据我用个拼接sql(根据日期拼接表名后缀,无关用户输入的拼接)插入到表不就好了。然后我就重构了我的屎山代码。

以下查询仍然是:按天分表,按create_time字段查询

正文

配置(依赖和application.properties)依旧是上篇sharding-jdbc的中展示的配置。有所区别的是指定分表算法策略的DateAlgorithm类(自定义的类)中多实现了一个RangeShardingAlgorithm重写doSharding以进行范围查询返回要查询表的集合。

    @Override
    public Collection doSharding(Collection collection, RangeShardingValue rangeShardingValue) {
        // 拿到范围
        Range range = rangeShardingValue.getValueRange();
        String lowerEndpoint = range.lowerEndpoint();
        String upperEndpoint = range.upperEndpoint();
        ArrayList list = new ArrayList<>();
        long betweendays = betweendays(lowerEndpoint, upperEndpoint);
        // 算出需要查询哪些表
        yesterday(new SimpleDateFormat("yyyy-MM-dd").parse(range.upperEndpoint()).getTime(),betweendays,list);
        return list;
    }
    public void yesterday(long date, long times, Collection collection){
        DateFormat dateFormat=new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        // 设置指定日期,月份需要减一
        calendar.setTime(new Date(date));
        String yesterdayDate=dateFormat.format(calendar.getTime());
        collection.add(logicTableName+yesterdayDate);
        calendar.set(Calendar.HOUR_OF_DAY,-24);
        if(times>0){
            times = times - 1;
            yesterday(calendar.getTimeInMillis(),times,collection);
        }
    }
    public long betweendays(String start,String end) throws Exception {
        //设置转换的日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //开始时间
        Date startDate = sdf.parse(start);
        //结束时间
        Date endDate = sdf.parse(end);
        //得到相差的天数 betweenDate
        return (endDate.getTime() - startDate.getTime())/(60*60*24*1000);
    }

 以上计算代码可以优化,留给你们啦!

到这里,我们相当于把自定义路由表的逻辑写完了。我们只需要这样用。注意,要有sharding-column的条件,本例中是create_time字段

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.between("create_time",start,end);
        List list;
        list = mapper.selectList(wrapper);

使用时可能会踩的坑

不要在自己写的mapper_sql的入参中使用@Param("xxx")注解。否则会出现sharding-jdbc识别不到入参的情况。

你可能感兴趣的:(开发,sql,java,sharding)