开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 订单模块 - 根据条件分页订单数据】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/758/detail/13319
MyCat - 订单模块 - 根据条件分页订单数据
内容介绍:
一、订单查询
二、查询所需步骤
三、测试
一、订单查询
1.订单的查询条件:
订单 id、支付方式、用户名和支付状态
通过这四个条件进行订单查询并且对查询结果进行分页,查询的结果包括订单 id、订单提交时间、用户名、订单金额、支付方式、订单省份及支付状态。
对于省份,省份在数据表结构中存储的形式:
(打开订单表,在订单表中看到 receive province, 该处表示收件人的省份)
在此处存放的实际是收件人省份的 id:
在进行页面展示时,不是展示 id,而是具体的省份名称,这时需要考虑多表查询,所以对订单查询来说,这是一个多表查询。
二、查询所需步骤
1.多表查询的 SQL 语句:
指定从 tb_order 这张表开始查询,并给这张表取别名为 o ,第二张表 tb_provinces 取别名为 p。
这样就能讲所有订单及订单关联的省份查询出来.
对我们来说,不需要返回查询所有信息,可以选择返回订单 id、订单提交数据(订单创建时间 create_time)、用户名(username)、订单金额(total _money)、支付方式(pay_type)、支付状态(pay_status)
根据查询方式(如下图)得到查询结果:
对于支付方式及支付状态需要在页面进行处理
SQL 语句定义完成,接下来编写 MyCat 接口及 MyCat 映射配置文件:
2.编写 MyCat 接口:
第一步:
选择 Interface
在该接口中声明一个方法:
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 映射配置文件
再声明一份配置文件:
然后添加头信息:
再在其中编写一个 select 语句:
<select id>=”search” resultMap=”orderMap”
由于 order 中字段与数据表中返回字段的不配备,所以要定义一个 orderMap,然后将之前写好的 select 语句写入:
对于该 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>
具体字段的对应情况:
配置文件已写好:
在该配置文件中,配置了当前数据库表结构中的字段和类中的属性的对应关系。
在其中 receiver_province 也是字符串类型,所以这里要将返回的省份信息直接封装到 receiver_province 中,即 p.’ province’ receiver_province
在页面获取时也通过 receiver_province 获取即可
配置完成后,还有最后一步:namespace
namespace 应该配置 Mapper 接口的权限另类名,将其拷贝后粘贴即可:
到此当前映射配置文件完成。
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;
}
该部分仍然报错:
只需将 Highlighting Level 调低即可:
到此,将 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)
至此,将订单查询接口定义完成。
三、测试
重启订单服务:
重启完成后,通过 Postman 对该接口再次进行测试
对当前服务执行 POST 请求:
执行:
这里抛出一个异常,该异常为请求体丢失。
因为这里 post 请求,还需要 JAON 格式的数据,即使没有任何查询条件,应该在请求体中给其应该空的 JSON 格式
再次执行:
共 22 条记录,当前返回 10 条
如果将每页订单记录数返回两条后再执行:
查询第一页:
查询第二页:
如果要根据订单号查询,则在参数块要加上 id :
这里报错,回到后端查看:
该错误是在执行 SQL 语句时抛出的,在查询总记录数时报错。
在这条 where 语句中,有两个关键字
将该 where 删除即可(因为上面已经有一个 where)
再次启动进行测试:
此时查询成功!