1. 程式人生 > 程式設計 >MybatisPlus自定義Sql實現多表查詢的示例

MybatisPlus自定義Sql實現多表查詢的示例

前言

前段時間看同事的程式碼,發現他用Layui+MybatisPlus做分頁查詢做得很規整,認真看了下程式碼發現這種方式不僅適用於與Layui做分頁查詢,在任何時候需要多表聯查的時候都可以用到。
以下以Layui分頁查詢作為參考,在實際應用中可以靈活使用。

分頁查詢VO物件

@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",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

IPage<Map<String,Object>> findClientPage(Integer num,Integer size,String registerTime);

ServiceImpl

這裡的QueryWrapper內的例項是<Map<String,Object>,不是平常的實體類,返回的也是Map。

@Override
public IPage<Map<String,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,括號裡的Constants.WRAPPER內容就是"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>

總結

這種方式相當於在業務層已經做好了引數判斷,不用再在xml檔案內用“if”標籤判斷了。
除了在與Layui做分頁查詢外,在別的需要引數請求的地方也都可以變通的用這種方法,在使用MybatisPlus時使用這種方式可以使程式碼更簡潔,更清晰。
除此之外,在需要多表聯查的時候,這種方式是非常適用的。

MybatiPlus文件

官方文件裡面也做介紹,版本需要大於3.0.7
官方連結:使用 Wrapper 自定義SQL

MybatisPlus自定義Sql實現多表查詢的示例

到此這篇關於MybatisPlus自定義Sql實現多表查詢的示例的文章就介紹到這了,更多相關MybatisPlus 多表查詢內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!