溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MybatisPlus中如何實現(xiàn)Sql的多表查詢

發(fā)布時間:2020-11-07 16:17:58 來源:億速云 閱讀:6611 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)MybatisPlus中如何實現(xiàn)Sql的多表查詢,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

前言

前段時間看同事的代碼,發(fā)現(xiàn)他用Layui+MybatisPlus做分頁查詢做得很規(guī)整,認(rèn)真看了下代碼發(fā)現(xiàn)這種方式不僅適用于與Layui做分頁查詢,在任何時候需要多表聯(lián)查的時候都可以用到。
 以下以Layui分頁查詢作為參考,在實際應(yīng)用中可以靈活使用。

分頁查詢VO對象

@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());
}

Service

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

ServiceImpl

這里的QueryWrapper內(nèi)的實例是<Map<String, Object>,不是平常的實體類,返回的也是Map。

@Override
public IPage<Map<String, Object>> findClientPage(Integer num, Integer size, String keyWord, String registerTime) {
  //創(chuàng)建QueryWrapper搜索對象,判斷參數(shù)不為空則傳入?yún)?shù)
  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,括號里的Constants.WRAPPER內(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>

總結(jié)

這種方式相當(dāng)于在業(yè)務(wù)層已經(jīng)做好了參數(shù)判斷,不用再在xml文件內(nèi)用“if”標(biāo)簽判斷了。
 除了在與Layui做分頁查詢外,在別的需要參數(shù)請求的地方也都可以變通的用這種方法,在使用MybatisPlus時使用這種方式可以使代碼更簡潔,更清晰。
 除此之外,在需要多表聯(lián)查的時候,這種方式是非常適用的。

MybatiPlus文檔

官方文檔里面也做介紹,版本需要大于3.0.7
官方鏈接:使用 Wrapper 自定義SQL

MybatisPlus中如何實現(xiàn)Sql的多表查詢

上述就是小編為大家分享的MybatisPlus中如何實現(xiàn)Sql的多表查詢了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI