MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例
前言
前段時間看同事的代碼,發(fā)現(xiàn)他用Layui+MybatisPlus做分頁查詢做得很規(guī)整,認(rèn)真看了下代碼發(fā)現(xiàn)這種方式不僅適用于與Layui做分頁查詢,在任何時候需要多表聯(lián)查的時候都可以用到。
以下以Layui分頁查詢作為參考,在實(shí)際應(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)的實(shí)例是<Map<String, Object>,不是平常的實(shí)體類,返回的也是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)容
重點(diǎn)在于我們用${ew.customSqlSegment}放在sql語句里,它可以直接把我們的wrapper里的查詢數(shù)據(jù)等同于where查詢添加進(jìn)去
<select id="findClientPage" resultType="java.util.Map">
SELECT c.id,c.real_name,c.phone,c.`status`,
//實(shí)現(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
//重點(diǎn)是這里會插入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

到此這篇關(guān)于MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例的文章就介紹到這了,更多相關(guān)MybatisPlus 多表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于jdbc連接mysql數(shù)據(jù)庫操作示例
這篇文章主要介紹了Java基于jdbc連接mysql數(shù)據(jù)庫操作,結(jié)合完整實(shí)例形式分析了java使用jdbc連接mysql數(shù)據(jù)庫的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07
IDEA2022創(chuàng)建SpringBoot項(xiàng)目的圖文教程
本文主要介紹了IDEA2022創(chuàng)建SpringBoot項(xiàng)目的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Spring Boot中使用Actuator的/info端點(diǎn)輸出Git版本信息
這篇文章主要介紹了Spring Boot中使用Actuator的/info端點(diǎn)輸出Git版本信息,需要的朋友可以參考下2017-06-06
Java+opencv3.2.0實(shí)現(xiàn)人臉檢測功能
這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)人臉檢測功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
淺談java對象結(jié)構(gòu) 對象頭 Markword
這篇文章主要介紹了淺談java對象結(jié)構(gòu) 對象頭 Markword,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
記一次Maven項(xiàng)目改造成SpringBoot項(xiàng)目的過程實(shí)踐
本文主要介紹了Maven項(xiàng)目改造成SpringBoot項(xiàng)目的過程實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

