前言
前段時間看同事的代碼,發(fā)現(xiàn)他用layui+mybatisplus做分頁查詢做得很規(guī)整,很值得學(xué)習(xí),記錄一下
返回給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是后臺管理頁面可以查詢的字段傳進來的,也就是普通的參數(shù)
@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);
//返回總數(shù)和數(shù)據(jù)
return new LayuiData (listPage.getTotal(),listPage.getRecords());
}
實現(xiàn)類
這里省略了Service代碼,創(chuàng)建的是QueryWrapper<Map<String, Object>>,不是平常的實體類泛型。
@Override
public IPage<Map<String, Object>> findClientPage(Integer num, Integer size, String keyWord, String registerTime) {
//創(chuàng)建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);
}
//創(chuàng)建分頁對象
Page<Map<String, Object>> page = new Page<>(num, size);
return clientMapper.findClientPage(page, wrapper);
}
Mapper
格式要求,QueryWrapper前面加上@param,括號里的內(nèi)容就是"ew",對應(yīng)xml文件里的ew
IPage<Map<String, Object>> findClientPage(Page<Map<String, Object>> page, @Param(Constants.WRAPPER) QueryWrapper<Map<String, Object>> wrapper);
XML內(nèi)容
重點在于我們用${ew.customSqlSegment}放在sql語句里,里面可以直接把我們的wrapper里的查詢數(shù)據(jù)等同于where查詢添加進去
<select id="findClientPage" resultType="java.util.Map">
SELECT c.id,c.real_name,c.phone,c.`status`,
//實現(xiàn)將時間轉(zhuǎn)換成固定格式
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

官方文檔
總結(jié)
感覺這種方式比在xml用<if>標(biāo)簽判斷的方式更加的簡便,相當(dāng)于在業(yè)務(wù)層已經(jīng)做好了參數(shù)判斷,不用再像<if test="">這樣在sql里面做判斷了,除了在Layui上面用這種方法外,在別的需要參數(shù)請求的地方也都可以變通的用這種方法。