前言
前段时间看同事的代码,发现他用layui+mybatisplus做分页查询做得很规整,很值得学习,记录一下
返回给layui的bean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LayuiData {
private Integer code=0;
private Long count;
private String msg="ok";
private Object data;
}
Controller
这里的keyWord和registerTime是后台管理页面可以查询的字段传进来的,也就是普通的参数
@GetMapping("/getClientList")
@ResponseBody
public LayUIResult getAll(
@RequestParam(name = "page", required = true, defaultValue = "1") int num,
@RequestParam(name = "limit", required = true, defaultValue = "10") int size,
String keyWord, String registerTime){
IPage<Map<String, Object>> listPage = clientService.findClientPage(num, size, keyWord,registerTime);
//返回总数和数据
return new LayuiData (listPage.getTotal(),listPage.getRecords());
}
实现类
这里省略了Service代码,创建的是QueryWrapper<Map<String, Object>>,不是平常的实体类泛型。
@Override
public IPage<Map<String, Object>> findClientPage(Integer num, Integer size, String keyWord, String registerTime) {
//创建QueryWrapper搜索对象
QueryWrapper<Map<String, Object>> wrapper = new QueryWrapper<>();
if (StringUtils.isNotEmpty(keyWord)) {
wrapper.like("c.real_name", keyWord).or().like("c.phone", keyWord);
}
if (StringUtils.isNotEmpty(registerTime)) {
String stime = registerTime.substring(0, 20);
String etime = registerTime.substring(22, 41);
wrapper.ge("c.register_time", stime).le("c.register_time", etime);
}
//创建分页对象
Page<Map<String, Object>> page = new Page<>(num, size);
return clientMapper.findClientPage(page, wrapper);
}
Mapper
格式要求,QueryWrapper前面加上@param,括号里的内容就是"ew",对应xml文件里的ew
IPage<Map<String, Object>> findClientPage(Page<Map<String, Object>> page, @Param(Constants.WRAPPER) QueryWrapper<Map<String, Object>> wrapper);
XML内容
重点在于我们用${ew.customSqlSegment}放在sql语句里,里面可以直接把我们的wrapper里的查询数据等同于where查询添加进去
<select id="findClientPage" resultType="java.util.Map">
SELECT c.id,c.real_name,c.phone,c.`status`,
//实现将时间转换成固定格式
DATE_FORMAT(c.register_time,'%Y-%m-%d %H:%i:%s') registerTime,
SUM(re.money) rechargeMoney, SUM(wi.withdrawal_money) withdrawalMoney,SUM(buy_money) orderMoney,
wa.balance
FROM client c
LEFT JOIN recharge re ON c.id=re.client_id
LEFT JOIN withdrawal wi ON c.id=wi.client_id
LEFT JOIN wallet wa ON c.id=wa.client_id
LEFT JOIN order_position ord on c.id=ord.client_id
//重点是这里会插入wrapper的搜索语句
${ew.customSqlSegment}
GROUP BY c.id
</select>
MybatiPlus文档
官方文档里面也做介绍,版本需要大于3.0.7
总结
感觉这种方式比在xml用<if>标签判断的方式更加的简便,相当于在业务层已经做好了参数判断,不用再像<if test="">这样在sql里面做判断了,除了在Layui上面用这种方法外,在别的需要参数请求的地方也都可以变通的用这种方法。