开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 商品管理 - 根据条件分页查询 SPU 列表 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/758/detail/13315
MyCat - 商品管理 - 根据条件分页查询 SPU 列表
内容介绍:
一、前言
二、演示
一、前言
本节继续讲解商品模块需求中的第二个需求:根据条件查询商品 SPu 列表。
先来看有哪些条件,下图为项目原型图。
根据条件查询商品首先是商品名称去模糊查询,然后根据副标题查询,然后是品牌、审核状态。
其中商品查询和副标题是模糊查询,而品牌和审核状态属于精确查询。
二、演示
步骤1、定义 Mapper 接口
在代码 SPUMapper.java 中:
/**
*
*根据 ID 查询 SPU 信息
*@param spuid
*@return
*/
public TbSpu findById(String spuid);
然后在第二方面生成一个代码
由于查询返回的是一个列表,在输入 public 后,再生成 List<TbSpu> 和方法serach(),
传递条件采用 Map <String,String> searchMap
即输入
public List<TbSpu> serach(Map <String,String> searchMap);
以上条件查询方法已经完成,可以添加注释条件查询:
/**
*条件查询
*@param searchMap
*@return
*/
声明好条件查询方法之后,在 SpuMapper.xml 中需要编写对应的映射配置文件写入 sql 语句,方法名与 ID 对应
<select id="search" resultMap="spuMap">
</select>
然后再来编写对应的 sql 语句,该 sql 语句需要查询 spu 信息,所以在<select id="search" resultMap="spuMap">
下输入select*from tb_spu
但是查询需要条件,在项目原型图中,输入条件,点击查询就可以进行查询 select的 SPU 的商品信息,如果只选了一个条件,根据该条件过滤,两个条件根据两个条件过滤,假如没有选择条件,那就是全部查询。
若是需要全部实现,则需要用到动态 sql 完成查询。
如下:
<where>
<if test="name != null and name != ‘’">
and name like '%$ {name}% '
</if>
<if test="caption != null and caption != ‘’">
and caption like ' %${caption}% '
</if>
<if test="brandId != null">
and brand_id = # { brandId}
</if>
<if test="status !=nul1 and status != "'">
and status =#{status}
</if>
</ where>
分别以 spu 的名称、副标题、品牌 ID、状态来进行查询。
步骤2、建立 Service 接口
在这层需要编写一个接口 public page(返回值:是由 pagehelper 所提供,因为需要分页,所以我们能使用到 pagehelper 分页插件来进行分页)方法名依旧是Map。
public Page search(Map<string,String>searchMap)
除了 Map 传递的条件外,还需要传递别的信息,即输入
public Page search(Map<string,String>searchMap,Integer page,Integer size);
并在上方注释“根据条件进行查询 spu 列表”
/**
*根据条件分页查询spu列表
*@param searchMap
*@param page
**/
步骤3、编制 SpuServicelmpl
设置分页查询的参数
//设置分页查询参数
PageHelper.startPage(page,size);
之后再调用 spuMapper 中的 search 方法
List<TbSpu> spulist=spuMapper.search(searchMap);
将 searchMap 传递过去后返回的是一个 list,list 实际类型是一个 page,所以输入return (Page)spuList;
步骤4、编制 SpuController
首先编制一个方法 public Result findPage(Map<String, String searchMap)
其中,searchMap 是当中的查询条件
之后,在此基础上在编制 Integer 类型的 page 和 Integer 类型的 size 如下:
public Result findPage(Map<String,String> searchMap,Integer page,Integer size)
传递参数之前需要在此基础的上方再编制 PostMapping 并赋予 value 值“/search/{page}/{size}-]”
,
并在此基础上再加上注解,
@Pathvariable("page")Integer page,@Pathvariable(”size”)Integer size){
这样分页参数即可传递
SearchMap 传递:由于使用的是 cost 请求,实际上就想让{Map<String,String>searchMap
参数转化成另一种格式,则在代码 Map 前添加注解 RequestBody,
public Result findPage(RequestBody Map<String,String>searchMap,
并调用 spuservice 中的方法 search 并传递 searchMap,page,size 之后会传递一个结果 pageResult
Page pageResult=spuservice. search(searchMap, page, size);
之后开始解析 page 内容:
1、通过 pageResult 调用方法 getTotal 可以拿到总记录数
(long total=pageResult. getTotal();)
2、再调用 pageResult 中的方法 getResult 即可拿到结果
既然是分页查询,就需要把结果封装到分页对象当中,如图所示:(找到分页对象)
依次是v_parent v_common src main java
cn.itcastentity pageResult
pageResult文档当中有两个参数第一个total(总记录数),第二个rows(结果列表)
private Long total;
//总记录数
private List<T> rows
//记录数
并在下方封装对象 new pageResult,利用此对象时,其中可以传递两项参数,第一项就是总记录数 total,第二项就是结果列表 Result, 之后就会返回一个pageResult,接下来直接返回上一个结果,输入代码 return new Reault(flag:true,Statuacode.ok,message:“查询成功",pageResult1)
即可完成。