前端请求参数:http://localhost:8080/order/page?page=1&pageSize=10&beginTime=2022-06-06%2000%3A00%3A00&endTime=2022-06-07%2023%3A59%3A59

后台我用String类型 来接受时间数据 加一个注解@DateTimeFormat将字符串转为时间类型

public R<Page> order(int page, int pageSize, Long number, @DateTimeFormat String beginTime,@DateTimeFormat String endTime)

queryWrapper.between(beginTime!=null&&endTime!=null,Orders::getCheckoutTime,beginTime,endTime); //根据日期查询

主要代码:

    @GetMapping("/page")public R<Page> order(int page, int pageSize, Long number, @DateTimeFormat String beginTime,@DateTimeFormat String endTime){// 分页构造器Page<Orders> pageInfo = new Page<>(page,pageSize); //创建要分页的数据Page<OrdersDto> dtoPage = new Page<>(); //要返回给前端的分页数据对象LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.orderByDesc(Orders::getOrderTime);queryWrapper.eq(number!=null,Orders::getId,number); // 根据订单号查询queryWrapper.between(beginTime!=null&&endTime!=null,Orders::getCheckoutTime,beginTime,endTime); //根据日期查询ordersService.page(pageInfo,queryWrapper); //根据用户id 查询订单表数据BeanUtils.copyProperties(pageInfo,dtoPage,"records"); // 拷贝分页信息 不包括records records里面有我们要传给前端的数据List<Orders> records = pageInfo.getRecords(); //获取recordsList<OrdersDto>   list   = records.stream().map((item)->{ //OrdersDto ordersDto = new OrdersDto(); //创建数据传输对象 数据传输对象继承了 orders 里面还有订单详细字段BeanUtils.copyProperties(item,ordersDto); // 把records中的数据拷贝 到数据传输对象中Long id = item.getId();             // 获取订单idLambdaQueryWrapper<OrderDetail> orderDetailLambdaQueryWrapper = new LambdaQueryWrapper<>(); //创建条件构造器orderDetailLambdaQueryWrapper.eq(OrderDetail::getOrderId,id); //根据订单id 去订单详细表中查询 订单详细数据List<OrderDetail> orderDetails= orderDetailService.list(orderDetailLambdaQueryWrapper);ordersDto.setOrderDetails(orderDetails); //把查询到详细订单信息 添加到数据传输对象中return ordersDto;   // 返回数据传输对象}).collect(Collectors.toList()); // 把遍历到结果转换为集合dtoPage.setRecords(list); //重新添加recordsreturn R.success(dtoPage);}

_____________________________________________________________________________

涉及知识点:

1.mysql中between和in的区别:

下面两条语句有什么区别,为什么都提倡使用范围查询 ?

select * from T where k in(1,2,3,4,5)
select * from T where k between 1 and 5
其实between和in这两个关键字应用的场景重合度并不高,但是我们可以通过思考这么一个问题,来理清这两者执行的执行过程和逻辑。

要回答这个问题就需要先了解索引的数据结构,以及mysql索引利用b+树执行查询的执行过程,这里先默认大家具备了这个条件。

先区分下可能的情况。

第一个是k字段是主键,第二个是k字段是二级索引,第三种情况是k是普通字段。

另外,我们需要搞清楚in关键字和between两种查询方式在执行的时候的不同之处;

in关键字其实是等值查询的合并,将多个等值查询合并成一个,减少查询和返回次数;
between查询是典型的范围查询,在命中索引的情况下,会直接在查询首个符合条件的数据,然后根据指针一次获取下一个叶子节点数据进行比较直到查询到不符合条件的数据为止。
现在我们再来对三种情况进行梳理,

k是主键索引和二级索引的情况是相似的,唯一的区别就是二级索引的话可能需要回表,回表不是这次讨论的重点,所以我们把这两种情况合并到一起说;

in 条件实际查询的时候是多次搜索索引树,而 between 条件只需要执行一次搜索树的查询就可以获得结果,本题为例,加入索引的底层实现结构使用的是b+树,使用关键字 in 要树搜素5次,也就是做5次等值查询;而 bewteen 基于b+树的范围查询逻辑,当找到第一个满足条件的叶子节点后,根据当前叶子节点指向的下一个叶子节点继续查询,直到查到不满足条件的叶子节点,所以只需要树搜索一次。

而对于k不是索引的情况,in条件相当于执行了多次的全文遍历,而between其实也是全文遍历,都不是一个好的方式。

2.前台传参后台,后台返参到前台,日期转换

1、@DateTimeFormat:
spring自带的,将String转换成Date,一般前台给后台传值时用。

@DateTimeFormat是Spring的注解,作用是限制前端传入的时间格式,如果格式不匹配,则会抛出异常,可以理解成一种格式限制,不加该注解,Spring也会将前端传入的时间字符串解析成Date类型

因为其用法比较单一,只用于将字符串格式化成日期,在加入spring以后,直接使用注解@DateTimeFormat(pattern=”yyyy-MM-dd”)即可。@DateTimeFormat 注解有3个可选的属性:style,pattern和iso。

属性允许我们使用自定义的日期/时间格式。该属性的值遵循java标准的date/time格式规范。缺省的该属性的值为空,也就是不进行特殊的格式化。通常情况下我们都是使用这个 注解做自定义格式化的。

2、@JsonFormat
主要用于后台传值到前台,@JsonFormat是Jackson的注解,和@JSONField功能相同,将日期按照指定格式进行格式化(eg:将Date转换成String ),模式的市区是GMT

在属性值上 @JsonFormat(pattern=”yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用 @JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )。

3、@JSONField
@JSONField是fastjson的注解,主要进行JSON解析和序列化,作用是将日期按照指定的格式,格式化为字符串,返回给前端。

目前最常的用属性是@JSONField(name=”resType”)和 @JSONField(format=”yyyy-MM-dd”)

name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。

format :@JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00.

项目开发遇到前端传递时间问题处理相关推荐

  1. 项目开发SOP前端执行SOP

    项目开发SOP&前端执行SOP 项目开发SOP 1.产品经理输出原型图以及进行评审 2.UI设计师跟进原型输出UI图 3.前端根据UI图进行前端界面开发 4.根据后端swagger进行字段填充 ...

  2. spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天

    spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天 分析: 解决办法 分析: 经过测试,时间从前台传到后台数据是一样的,说明是后台向数据库传递过程中出现了问题 解决办法 ...

  3. web项目开发 之 前端规范 --- JSON数据传输规范

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 此文严格 ...

  4. 项目开发规范--前端

    通用规范 基本原则: 编译器统一设置编码为UTF-8:换行符为LF. 源文件编码格式(包括注释)必须是 UTF-8 命名必须使用英文单词,不可出现拼音 命名缩写,行业约定俗称的缩写可以直接使用 命名缩 ...

  5. web项目开发 之 前端规范 --- CSS编码规范

    此文严格按照W3C规范和部分实际项目可读性,浏览器加载,性能等众多属性权衡,做出平时前端编码规范 文档.供广大web工作者参考并实施,对维护和项目扩展升级都能省时省力. 转载请注明出处:JS前端实用开 ...

  6. web项目开发 之 前端规范 --- HTML编码规范

    此文严格按照W3C规范和部分实际项目可读性,浏览器加载,性能等众多属性权衡,做出平时前端编码规范文 档.供广大web工作者参考并实施,对维护和项目扩展升级都能省时省力. 转载请注明出处,JS前端实用开 ...

  7. MIMIC 以太坊医疗项目开发(2) 前端H5介绍

    Vue.js 是一套H5用户界面的渐进式框架.只关注视图层, 采用自底向上增量开发的设计, 通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 前端基于Vue框架编写. mounted是v ...

  8. SpringBoot+MyBatisPlus实现前端传递时间查询条件ajax请求后台并回显数据流程整理

    场景 前端时间选择控件,选择时间后点击搜索,请求后台数据,后台根据时间查询数据库中 一天的记录数并回显给前端,前端进行显示. 实现 前端页面代码(部分) <div class="ibo ...

  9. 仿掘金社区全栈项目开发(二)-前端工程化

    前端工程化 webpack 核心概念 看官方文档:https://webpack.docschina.org/concepts/ 小demo 参考博客:https://juejin.cn/post/6 ...

最新文章

  1. <LINUX内核完全剖析:基于0.12内核> 笔记一
  2. wps右键新建里面没有word和excel_wps常用的基本操作方法
  3. 区块链系列教程之:比特币中的网络和区块链
  4. 关于扁平化视觉设计趋势的一些小分享
  5. Angular jasmine单元测试框架里describe的实现原理
  6. Colima:MacOS 上的极简容器运行时和 Kubernetes
  7. sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
  8. php实现先序、中序、后序遍历二叉树
  9. [转]如何学好windows c++编程 学习精髓(收集,整理)
  10. 求职简历-机器学习工程师V2
  11. Java面试相关问题以及解析
  12. 科普类毕业论文文献包含哪些?
  13. 在固定宽高内显示固定数量的最大正方形
  14. 1148 - 【入门】数数小木块
  15. DTAS棣拓三维公差分析软件容差分析软件蒙特卡洛法:DTAS Talk尺寸联盟参与公益课
  16. 海尔智家、海尔电器合体战美的、格力
  17. 各行业常见的资质证书
  18. MySQL数据库:创建一个表,并执行插入、修改和删除数据操作
  19. 【Spring boot 中 Excel 模板文件损坏问题】
  20. 使用pe安装系统windows系统

热门文章

  1. 基于时间序列分析方法的零售业快消品销量预测研究
  2. 五千来字小作文,是的,我们是有个HTTP。
  3. 奔驰809android auto,奔驰E Android Auto+AA Mirro技术作业
  4. 微信端H5的相关问题总结
  5. win10电池图标不能调亮度_win10屏幕亮度无法调节?一招解决Win10电脑亮度调节失灵...
  6. 最满意的10款PC 软件分享
  7. 小米三季报:手机不振,汽车加码
  8. 微信c语言刷题软件,独家全能微信刷题小程序正式上线(经典秒杀口诀模块全民共享)...
  9. 过敏性鼻炎的治疗和保养
  10. linux系统tcl电视刷机包,tcl电视刷机包tcl电视升级包系统修复tcl电视强刷包