前段时间写了《RabbitMQ入门》系列

  • RabbitMQ入门-初识RabbitMQ
  • RabbitMQ入门-从HelloWorld开始
  • RabbitMQ入门-高效的Work模式
  • RabbitMQ入门-消息派发那些事儿
  • RabbitMQ入门-消息订阅模式
  • RabbitMQ入门-Routing直连模式
  • RabbitMQ入门-Topic模式
    主要讲了一些RabbitMQ的基本知识点,后面准备再起个Spring集成RabbitMQ系列,希望能够更加贴近我们的日常接触的生产环境。

今天这篇跟Mybatis以及sql语句有关,正好也是今天解决问题的实践总结。

流水统计

业务背景

做一个流水统计的功能,从流水明细表中,每天定时同步前一天的流水,按照两个以上的维度统计并存储到新的统计表中。

对于明细表中过时的数据需要清除以防止明细表的无限增长。

设计思路

因为项目使用的是Mybatis,所以需要在这个框架下实现想要的功能。抛开框架,问题比较简单,最核心的其实是sql语句。

但是坦白说,sql语句一直也就是简单的使用,尤其是现如今有以Hibernate等为代表ORM框架,我们很少需要手写那些sql语句,甚至在一些成熟的产品项目里,sql语句更是难得一见。

整个思路很简单,我需要定义一个定时器,这个可以使用Spring Quartz来配置,其中还涉及到Cron expression即定时器表达式。然后我们要在Mybatis的壳子里塞入我们需要的sql语句。最后待时间点一到就执行sql语句完成流水统计,就大功告成了。下面罗列些解决这个问题的点。

Mybatis

个人认为Mybatis是灵活的,但同时也是繁琐的。为了写上一个我们想要执行的sql语句,需要写一大堆的声明代码。

有的sql语句有输入参数比如where后的比较条件就涉及到参数,这时候在Mybatis就要提供输入参数的入口,我们可以用parameterType来定义你想要的输入参数。相应的,执行完sql语句有时候会有返回结果,比如select完后的结果,这时候我们可以通过resultMap来返回,必要的时候你需要定义一个resultMap,好比下面这样

MyBatis-从查询昨天的数据说起

这实际上是一种映射,将数据库字段的identity_card_id与Model中的identityCardId对应起来。

对于我们的问题来说,需要首先从明细表中查出所有符合条件的流水明细记录,然后将符合条件的记录统计并插入到统计表中。Mybatis提供了增删改查相应的声明标签<insert><delete><update><select>,需要执行的sql语句可以放在对应的标签中。

如何查询昨天的数据

在解决查询昨天的数据这个问题之前,我们首先得知道怎么获取今天的日期。

SYSDATE()

通过SYSDATE()我们可以获得当前时间,如果你经常用sql语句,应该还知道有一个now()函数,两个都是可以查到当前的时间,但是区别在于now()一旦执行后就不变了,而SYSDATE()每次执行都是当前的时间。

DATE_FORMAT

有了SYSDATE()我们确实可以拿到当前时间了,那么怎么才能得到我们想要的时间格式呢,众所周知,时间的表示法千千万,比如20170809,2017-08-09等等。

这时候我们需要使用DATE_FORMAT()得到我们想要的日期格式比如DATE_FORMAT(SYSDATE(), '%Y-%m-%d')执行完后,我们就得到了结果“2017-08-09”。有关DATE_FORMAT中的第二个参数可以选择的值如下

DATE_SUB

有了格式化的DATE_FORMAT函数,我们可以得到想要的日期格式,有了SYSDATE()也能够得到今天的具体时间了,那么如何得到昨天,明天的时间呢,如果这步可以实现,那么离我们统计昨天所有流水明细的任务就不远了。

这时候我们可以用DATE_SUB来解决,比如date_sub(SYSDATE(), interval 1 day)表示在当前时间的基础上往前提一天就是昨天。当然,我们也可以使用DATE_ADD把日期调到明天。

有了这些sql的函数,我们已经可以实现预期的功能了。最终的sql语句类似

MyBatis-从查询昨天的数据说起

有了这些知识点,对于上面提到的定期删除数据以及其他的数据整理工作基本上都能解决了,剩下的就是敲代码实现业务了。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

MyBatis-从查询昨天的数据说起的更多相关文章

  1. mybatis框架-查询用户表中的记录数

    之前已经搭建过mybatis框架了,现在我们要用mybatis框架真正的干点事情了. 这是这个简单web项目的整体架构. 我们使用mybatis框架查询用户表中的记录数: 这是用户类: package ...

  2. java之mybatis之查询及分页

    1.mybatis中查询方式有3种 //查询单个值 @Test public void testFindOne()throws IOException{ SqlSession session = My ...

  3. Mybatis关联查询和数据库不一致问题分析与解决

    Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...

  4. mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写

    sqlyog设置一直习惯用sqlyog来管理mysql数据库,但有三个地方用得不是很爽:1.默认查询条数只有1000条经常需要勾选掉重新查询.2.自动替换关键字大小写,有时候字段名为关键字的搞成大写的 ...

  5. myBatis批量查询操作,xml中使用foreach案例

    使用场景:有一个订单表,实体类为OrderBase.java,订单有个状态为status值可能为"1,2,3,4,5,6",现在需要查询状态为"2,3,4"的订 ...

  6. MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射

    先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出 ...

  7. MyBatis基础:MyBatis关联查询(4)

    1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...

  8. mysql查询语句,通过limit来限制查询的行数。

    mysql查询语句,通过limit来限制查询的行数. 例如: select name from usertb where age > 20 limit 0, 1; //限制从第一条开始,显示1条 ...

  9. sql语句,查询昨天的数据

    如果在程序中,有前台传来两个时间点:beginTime和endTime,在sql查询中的限制条件就是查询昨天的数据,那么可以这样写: 但是如果在这里要查询昨天的数据的话, 则不能简单地在开始时间的那里 ...

随机推荐

  1. CSS3学习系列之背景相关样式(一)

    新增属性: background-clip:指定背景的显示范围 background-origin:指定绘制背景图像时的起点 background-size:指定背景中图像的尺寸 background ...

  2. 关于DOM中的model(将元素转成对象进行操作)

    DOM document (html, xml) object 将文档中的HTML元素转成js的对象 通过ID找到文档的元素转成js对象 var obj = document.getElementBy ...

  3. Spring Boot框架的搭建

    一.优点: 1.简化了配置,是基于Spring4的一套快速开发整合包,减少复杂度 而Spring MVC基于Spring 的一个MVC框架 2.会有一个statrter整合包,减少样板代码 3.自动配 ...

  4. Machine Learning and Data Mining Lecture 1

    Machine Learning and Data Mining Lecture 1 1. The learning problem - Outline     1.1 Example of mach ...

  5. (转)ManyToMany注解

    @ManyToMany  注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Student类中有 ...

  6. [POJ2104/HDU2665]Kth Number-主席树-可持久化线段树

    Problem Kth Number Solution 裸的主席树,模板题.但是求k大的时候需要非常注意,很多容易写错的地方.卡了好久.写到最后还给我来个卡空间. 具体做法参见主席树论文<可持久 ...

  7. HDU 1728 逃离迷宫(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)  ...

  8. Docker与KVM之间的区别

    一.Docker简介 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案. Docker 的基础是 Linux 容器(LXC)等技术. 在 LXC 的基础上 Docker 进行了进一步的封装 ...

  9. Merge Two Sorted Lists & Remove Nth Node From End of List

    1.合并两个排好序的list Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The ...

  10. 现在,以编程方式在 Electron 中上传文件,是非常简单的!

    必要的上下文 想尽快熟悉上下文语境的,可以点这里: https://github.com/electron/electron/issues/749 这段讨论,其实本来是讨论如何自动设置 input 标 ...