码农知识堂 - 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识别不到入参的情况。

  • 相关阅读:
    TimesNet:时间序列预测的最新模型
    OpenHarmony4.0对RK3566的烧写过程
    ssm毕设项目学生公寓智慧管理系统d6472(java+VUE+Mybatis+Maven+Mysql+sprnig)
    [深入研究4G/5G/6G专题-48]: 5G Link Adaption链路自适应-4-下行链路自适应DLLA-PDCCH信道
    docker集群主从容错 扩容 缩容
    MATH-现代-行列式
    SpringBoot怎么自定义一个Starter?
    自定义中间件
    jvm参数查看
    正则表达式 - 语法
  • 原文地址: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号