600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 项目开发遇到前端传递时间问题处理

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

时间:2021-06-28 14:58:57

相关推荐

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

前端请求参数:http://localhost:8080/order/page?page=1&pageSize=10&beginTime=-06-06%2000%3A00%3A00&endTime=-06-07%%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”)就会出现-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”)主要用于格式化日期,比如前台传过来的时间是-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是-07-12 00:00:00.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。