MyCat - 订单模块 - 根据条件分页订单数据 | 学习笔记

简介: 快速学习 MyCat - 订单模块 - 根据条件分页订单数据

开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 订单模块 - 根据条件分页订单数据】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/758/detail/13319


MyCat - 订单模块 - 根据条件分页订单数据

内容介绍:

一、订单查询

二、查询所需步骤

三、测试

 

一、订单查询

1.订单的查询条件:

订单 id、支付方式、用户名和支付状态

通过这四个条件进行订单查询并且对查询结果进行分页,查询的结果包括订单 id、订单提交时间、用户名、订单金额、支付方式、订单省份及支付状态。

image.png

对于省份,省份在数据表结构中存储的形式:

(打开订单表,在订单表中看到 receive province, 该处表示收件人的省份)

image.png

在此处存放的实际是收件人省份的 id:

image.png

在进行页面展示时,不是展示 id,而是具体的省份名称,这时需要考虑多表查询,所以对订单查询来说,这是一个多表查询。

 

二、查询所需步骤

1.多表查询的 SQL 语句:

指定从 tb_order 这张表开始查询,并给这张表取别名为 o ,第二张表 tb_provinces 取别名为 p。

image.png

这样就能讲所有订单及订单关联的省份查询出来.

对我们来说,不需要返回查询所有信息,可以选择返回订单 id、订单提交数据(订单创建时间 create_time)、用户名(username)、订单金额(total _money)、支付方式(pay_type)、支付状态(pay_status)

根据查询方式(如下图)得到查询结果:

image.png

对于支付方式及支付状态需要在页面进行处理

SQL 语句定义完成,接下来编写 MyCat 接口及 MyCat 映射配置文件:

2.编写 MyCat 接口:

第一步:

选择 Interface

image.png

在该接口中声明一个方法:

public List< TbOrder >search();

(返回的是一个列表,该列表名为 TbOrder ,再起方法名为 search)

由于这里执行的是条件查询,按照之前的操作方式要用 Map 传递条件。

该方法的目的是根据条件查询订单数据:

import cn.itcast.model.TbOrder;

import java. util.List ;

import java.util. Map;

public interface orderMapper {

public List<Tborder> search (Map<string,string> searchMap);

}

2.接口完成,再编写 MyCat 映射配置文件

再声明一份配置文件:

image.png

然后添加头信息:

image.png

再在其中编写一个 select 语句:

<select id>=”search” resultMap=”orderMap”

由于 order 中字段与数据表中返回字段的不配备,所以要定义一个 orderMap,然后将之前写好的 select 语句写入:

image.png

对于该 select 语句,还需要加入查询条件:

//判断 orderId 有无传递

<where>

<if test="orderId != null and orderId != ‘ ” ">

and o.id =#{orderId}

</if>

<if test="payType != null and payType != ‘ " ">

and o.pay_type = #{payType}

</if>

if test="username != null and username != ' " ">

and o.username = #{username}

</if>

if test=""payStatus = nul and paystatus l= ‘ “ ">

/*此处查询的是支付状态,支付状态对应的数据库表结构中的数据

*/

and o.pay_status=#{payStatus}

</if>

</where>

上面这段 select 语句编写完成,使用了动态 select ,原因是因为用户的查询条件可能不确定,有可能输入一个或者两个,也有可能不输入。

resultMap 的定义

//声明一个 resultMap

<resultMap id "orderMap"  type =”cn .itcast.model . TbOrder">

</ resultMap>

具体字段的对应情况:

配置文件已写好:

image.png

在该配置文件中,配置了当前数据库表结构中的字段和类中的属性的对应关系。

在其中 receiver_province 也是字符串类型,所以这里要将返回的省份信息直接封装到 receiver_province 中,即 p.’ province’ receiver_province

image.png

在页面获取时也通过 receiver_province 获取即可

配置完成后,还有最后一步:namespace

namespace 应该配置 Mapper 接口的权限另类名,将其拷贝后粘贴即可:

image.png

到此当前映射配置文件完成。

3.接下来编写 service 层的代码逻辑

在里面先建一个包

在 OrderService 中定义一个接口

import java. util.Map;

public interface orderservice {

public void add (TbOrder order) ;

//根据条件分页查询订单信息

//考虑到分页,这里直接返回一个 Page 对象,方法为 search

public Page search (Map<String,String> searchMap,Integer page,Integer size)

}

接口对应完成后定义其实现:
先注入 Mapper 接口

@Autowired

private OrderMapper orderMapper()

然后设置分页参数和执行分页查询:

@Override

public Page search (Map<String,String> searchMap,Integer page,Integer size) {

//1.设置分页参数

PageHelper.startPagre(page, size);

//2.执行分页查询

List<TbOrder> orderList = orderMapper.search ( searchMap) ;

//返回的 List 实际类型为 Page ,所以下面可以强制转换为 Page //类型

return ( Page) orderList;

}

该部分仍然报错:

image.png

只需将 Highlighting Level 调低即可:

image.png

到此,将 service 的底层逻辑实现完成

4.接下来编写 OrderController :

在里面增加一个方法

模拟添加:

//用 Map 封装请求条件(查询条件)

//需要添加注解,路径中传递 page 和 size

@PostMapping ( "/search/ {page}/ { size}")

public Result find Page(Map<String,String> searchMap,Integer page,Integer size){

//在该方法中调用 orderService 中的一个方法

Page page1=orderService.search(searchMap,page,size);

//得到总记录数

long total=page1.getTotal();

//得到结果列表

List result =page1.getResult();

//将上面两个信息封装到分页监控对象配置到 result 中

PageResult pageResult=new PageResult(total,result,);

return new Result(true,StatusCode.OK,message”查询成功”,pageResult)

}

注意:页面传递过来的参数都是 JSON 数据,这里需要封装到 Map 中,所以改为:

public Result find Page(@RequestBodyMap<String,String> searchMap,Integer page,Integer size)

由于路径中传递过来的 page 及 size ,所以还要加一个注解:

public Result find Page(@RequestBodyMap<String,String> searchMap, @PathVariable ( "page")Integer page, @PathVariable ( "page")Integer size)

至此,将订单查询接口定义完成。

 

三、测试

重启订单服务:

image.png

重启完成后,通过 Postman 对该接口再次进行测试

对当前服务执行 POST 请求:

image.png

执行:

这里抛出一个异常,该异常为请求体丢失。

因为这里 post 请求,还需要 JAON 格式的数据,即使没有任何查询条件,应该在请求体中给其应该空的 JSON 格式

再次执行:

image.png

共 22 条记录,当前返回 10 条

如果将每页订单记录数返回两条后再执行:

查询第一页:

image.png

查询第二页:

image.png

如果要根据订单号查询,则在参数块要加上 id :

image.png

这里报错,回到后端查看:

image.png

该错误是在执行 SQL 语句时抛出的,在查询总记录数时报错。

在这条 where 语句中,有两个关键字

将该 where 删除即可(因为上面已经有一个 where)

再次启动进行测试:

image.png

此时查询成功!

相关文章
|
安全 Java 数据安全/隐私保护
|
缓存
npm install 一直卡着不动如何解决
npm install 一直卡着不动如何解决
7970 0
|
安全 网络安全 数据安全/隐私保护
GoIP
GoIP “【5月更文挑战第15天】”
862 2
|
人工智能 安全 PyTorch
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
SPDL是Meta AI推出的开源高性能AI模型数据加载解决方案,基于多线程技术和异步事件循环,提供高吞吐量、低资源占用的数据加载功能,支持分布式系统和主流AI框架PyTorch。
511 10
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
|
安全 Java 数据库
SpringSecurity实现多种登录方式,如邮件验证码、电话号码登录
SpringSecurity实现多种登录方式,如邮件验证码、电话号码登录
3002 2
|
API
查询城市手机号段免费API接口教程
此API用于查询指定城市的手机号段、服务商、区号、邮编等信息。支持POST或GET请求,需提供用户ID、KEY及城市名称等参数。返回数据包括状态码、信息提示、查询数量、最大页码、当前页码、省份、城市、区号、邮编、区划代码及数据集等。示例中提供的ID和KEY为公共测试用,建议使用个人ID和KEY以获得更高的调用频率。
311 5
|
机器学习/深度学习 人工智能 前端开发
如何正确拆分数据集?常见的三种方法总结
如何正确拆分数据集?常见的三种方法总结
487 5
|
网络协议 SDN 数据中心
VXLAN的应用场景
VXLAN技术用于云数据中心间虚拟机迁移,确保迁移过程中业务连续性和网络无感知。通过在虚拟机上联交换机配置VXLAN信息,建立VXLAN隧道和网关,实现跨数据中心的大范围二层网络连接。在SDN环境下,SDN控制器可管理VXLAN的IP和VID对应关系,提高灵活性与扩展性。
469 3
|
传感器 NoSQL 算法
ROS Moveit 配置全网最详细教程
本文是关于ROS Moveit配置的全网最详细教程,提供了一键安装脚本,以及如何使用Moveit进行机器人运动规划的详细步骤和说明。文中还深入解析了Moveit的配置包文件、Moveit的源码,以及如何使用不同的运动规划算法(如CHOMP、LERP、STOMP)进行路径规划。
2752 1
ROS Moveit 配置全网最详细教程
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
1012 6