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

前段时间写了《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的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

Oracle数据库中最让人匪夷所思的十大问题盘点

数据的世界无奇不有,常常会遇到一些超出常识之外的故障的发生。这就要求广大的DBA要深入了解数据库的内部机制,面对一些奇葩的故障或者问题能够拨开迷雾找到真相。今...

30750
来自专栏章鱼的慢慢技术路

查询自动售货机中的商品价格

16230
来自专栏hadoop学习笔记

全文检索Solr集成HanLP中文分词

以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),...

19730
来自专栏Elasticsearch实验室

Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

       Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。用户可以使用Lucene 或 基于Lucene的成熟产品Nut...

28680
来自专栏性能与架构

Kafka 流数据 SQL 引擎 -- KSQL

KSQL 是什么? KSQL 是一个 Kafka 的 SQL 引擎,可以让我们在流数据上持续执行 SQL 查询 例如,有一个用户点击流的topic,和一个可持续...

46160
来自专栏逸鹏说道

我为NET狂官方面试题-数据库篇答案

说明:如有错误可以批评指正,有更好写法也可以提点下~ 1. 求结果:select "1"? 报错,SQL里面只有单引号,列如:'xx' 2. 查找包含"obj...

36480
来自专栏草根专栏

Entity Framework Core 2.1,添加种子数据

EFCore 2.1出来有一段时间了,里面的新功能还没怎么用,今天研究下如何使用EF Core 2.1添加种子数据。

18010
来自专栏Hadoop数据仓库

HAWQ技术解析(十七) —— 最佳实践

一、HAWQ参数配置最佳实践 (原文地址:http://hawq.incubator.apache.org/docs/userguide/2.1.0.0-inc...

22870
来自专栏程序员的SOD蜜

还在写SQL的同志,去喝杯咖啡吧!

--标题可能比较“雷人”,但这是我今天早上的第一个感受。我们有一个同事昨天加班写了一大堆有关某些大表(字段很多的表)的增、删、查的SQL语句,看着哪些SQL语句...

24650
来自专栏腾讯云Elasticsearch Service

Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

       Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。用户可以使用Lucene 或 基于Lucene的成熟产品Nut...

26910

扫码关注云+社区

领取腾讯云代金券