码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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以进行范围查询返回要查询表的集合。

    1. @Override
    2. public Collection doSharding(Collection collection, RangeShardingValue rangeShardingValue) {
    3. // 拿到范围
    4. Range range = rangeShardingValue.getValueRange();
    5. String lowerEndpoint = range.lowerEndpoint();
    6. String upperEndpoint = range.upperEndpoint();
    7. ArrayList list = new ArrayList<>();
    8. long betweendays = betweendays(lowerEndpoint, upperEndpoint);
    9. // 算出需要查询哪些表
    10. yesterday(new SimpleDateFormat("yyyy-MM-dd").parse(range.upperEndpoint()).getTime(),betweendays,list);
    11. return list;
    12. }
    13. public void yesterday(long date, long times, Collection collection){
    14. DateFormat dateFormat=new SimpleDateFormat("yyyyMMdd");
    15. Calendar calendar = Calendar.getInstance();
    16. // 设置指定日期,月份需要减一
    17. calendar.setTime(new Date(date));
    18. String yesterdayDate=dateFormat.format(calendar.getTime());
    19. collection.add(logicTableName+yesterdayDate);
    20. calendar.set(Calendar.HOUR_OF_DAY,-24);
    21. if(times>0){
    22. times = times - 1;
    23. yesterday(calendar.getTimeInMillis(),times,collection);
    24. }
    25. }
    26. public long betweendays(String start,String end) throws Exception {
    27. //设置转换的日期格式
    28. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    29. //开始时间
    30. Date startDate = sdf.parse(start);
    31. //结束时间
    32. Date endDate = sdf.parse(end);
    33. //得到相差的天数 betweenDate
    34. return (endDate.getTime() - startDate.getTime())/(60*60*24*1000);
    35. }

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

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

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

    使用时可能会踩的坑

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

  • 相关阅读:
    解决Django中调页面时出现“Did you forget to register or load this tag”报错
    民安智库(第三方社会评估调研公司)不同客户满意度分析方法应用场景
    信号与系统1——Signals and Systems
    【CF780G】Andryusha and Nervous Barriers 题解
    day17正则表达式作业
    Java并发(十二)----线程应用之多线程解决烧水泡茶问题
    算法leetcode|87. 扰乱字符串(rust重拳出击)
    Java 8 Stream API 引入和使用
    CentOS 7 安装 openGauss 3.0 企业版(单节点)
    荷兰国旗问题与快速排序算法
  • 原文地址:https://blog.csdn.net/wai_58934/article/details/127850201
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号