前段时间写了《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. iOS 输入限制之 InputKit

    前言 最近接手了两个 O2O 的老项目,其中的 Bug 也不言而喻,单看项目中的布局就有 n 种不同的方式,有用纯代码的,有用 Masonry 的,有用 VFL 的,也有用 Xib 的,更有用代码约束 ...

  2. 发布.NET MVC网站 到Azure

    最近的项目部署在Microsoft Azure,学习了一些新东西,记录下. 1.账号. 用于登录portal(https://portal.azure.cn/),账号下有对应的Subscription ...

  3. CSS学习笔记05 display属性

    HTML标记一般分为块标记和行内标记两种类型,它们也称块元素和行内元素. 块元素 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性,常用于网页布局和网页结构的搭建.并且块级 ...

  4. [leetcode-526-Beautiful Arrangement]

    Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...

  5. cygwin安装gcc/g++

    安装cygwin如果按照默认的方式一直点下去的话,安装完了会发现没有安装gcc/g++. 这个时候可以在安装文件的目录打开命令行,并输入: setup-x86_64.exe -q -P wget -P ...

  6. redis内存管理

    Redis主要通过控制内存上线和回收策略来实现内存管理. 1. 设置内存上限 redis使用maxmemory参数限制最大可用内存.限制的目的主要有: 用户缓存场景,当超出内存上限maxmemory时 ...

  7. 从零搭建DotnetCore2.0

    右键解决方案>新建项目> 选择Web>ASP.NETCoreWeb应用程序(.NET Core) 选择Web应用程序,暂时不选择启用Docker,身份验证选择个人用户账户(会自动生成 ...

  8. Xcode导出App一般问题及其解决方法(开发者协议变更及Bundle Id过期问题)

    Xcode导出App一般问题及其解决方法 问题一:开发者协议变更问题. 变更后打包会出现如下图A警告,此时点击 "visit developer website"进入Apple开发 ...

  9. getcomputedstyle()获取border像素差异问题

    getComputedStyle()方法返回的是一个CSS样式声明对象--CSSStyleDeclaration对象(与style属性的类型相同),包含当前元素所有最终使用的CSS属性值: <! ...

  10. if __name__ == '__main__' 如何正确理解

    今天有个初学Python 的朋友问我这个问题,他说在网上好多回答他都不太理解.所以这里我来做说一下,希望能把这个问题说明白. 先举一个例子:假设我们有一个add.py文件,里面的代码是这样: def ...