Java Fluent Mybatis 聚合查詢與apply方法詳解流程篇
前言
接著上一篇文章:Java Fluent Mybatis 分頁(yè)查詢與sql日志輸出詳解流程篇
我把分頁(yè)已經(jīng)調(diào)整好了,現(xiàn)在實(shí)驗(yàn)一下官方給出的聚合查詢方法。
GitHub代碼倉(cāng)庫(kù):GitHub倉(cāng)庫(kù)
數(shù)據(jù)準(zhǔn)備
為了聚合查詢的條件,添加了幾條數(shù)據(jù)。
MIN
我們?cè)囍@取最小的年齡。
方法實(shí)現(xiàn)
@Override public Integer getAgeMin() { Map<String, Object> result = testFluentMybatisMapper .findOneMap(new TestFluentMybatisQuery().select.min.age("minAge").end()) .orElse(null); return result != null ? Convert.toInt(result.get("minAge"), 0) : 0; }
控制層代碼
@ApiOperation(value = "獲取最小年齡", notes = "獲取最小年齡") @RequestMapping(value = "/getAgeMin", method = RequestMethod.GET) @ResponseBody public Result<Integer> getAgeMin() { try { return Result.ok(aggregateService.getAgeMin()); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
調(diào)試代碼
代碼說(shuō)明:
1、age("minAge")為什么要加一個(gè)字符串進(jìn)去呢?不加可以嗎?答案是可以,不過你看到的結(jié)果返回時(shí)這樣的。
沒錯(cuò),括號(hào)內(nèi)的是聚合查詢結(jié)果別名,不傳的話結(jié)果比較尷尬,建議還是傳一下。
MAX
在做max聚合函數(shù)的時(shí)候,我來(lái)搞復(fù)雜一點(diǎn),加上group by。
定義返回實(shí)體。
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** @Author huyi @Date 2021/10/26 14:15 @Description: 聚合最大年齡返回體 */ @Data @AllArgsConstructor @NoArgsConstructor @Builder public class AggregateMaxAgeRsp { private String name; private Integer maxAge; }
方法實(shí)現(xiàn)
@Override public List<AggregateMaxAgeRsp> getAgeMaxByName() { List<Map<String, Object>> result = testFluentMybatisMapper.listMaps( new TestFluentMybatisQuery() .select .name() .max .age("maxAge") .end() .groupBy .name() .end()); if (result != null && result.size() != 0) { List<AggregateMaxAgeRsp> list = new ArrayList<>(); result.forEach( x -> list.add(BeanUtil.fillBeanWithMapIgnoreCase(x, new AggregateMaxAgeRsp(), false))); return list; } else { return null; } }
控制層代碼
@ApiOperation(value = "根據(jù)年齡分組并獲取最大年齡", notes = "根據(jù)年齡分組并獲取最大年齡") @RequestMapping(value = "/getAgeMaxByName", method = RequestMethod.GET) @ResponseBody public Result<List<AggregateMaxAgeRsp>> getAgeMaxByName() { try { return Result.ok(aggregateService.getAgeMaxByName()); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
調(diào)試代碼
OK,沒什么問題。
代碼說(shuō)明:
1、使用了Hutools工具BeanUtil將map的值填充到實(shí)體對(duì)象中。
SUM、AVG、COUNT
sum、avg、count加一起試試吧。
定義返回體
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** @Author huyi @Date 2021/10/26 14:50 @Description: 聚合平均總和返回體 */ @Data @AllArgsConstructor @NoArgsConstructor @Builder public class AggregateAgeSumAvgAndCountRsp { private String name; private Integer sum; private Integer avg; private Integer count; }
方法實(shí)現(xiàn)
@Override public List<AggregateAgeSumAvgAndCountRsp> getAgeSumAvgCountByName() { List<Map<String, Object>> result = testFluentMybatisMapper.listMaps( new TestFluentMybatisQuery() .select .name() .sum .age("sum") .avg .age("avg") .count("count") .end() .groupBy .name() .end()); if (result != null && result.size() != 0) { List<AggregateAgeSumAvgAndCountRsp> list = new ArrayList<>(); result.forEach( x -> list.add( BeanUtil.fillBeanWithMapIgnoreCase( x, new AggregateAgeSumAvgAndCountRsp(), false))); return list; } else { return null; } }
控制層代碼
@ApiOperation(value = "根據(jù)年齡分組并獲取年齡和、平均年齡、數(shù)量", notes = "根據(jù)年齡分組并獲取年齡和、平均年齡、數(shù)量") @RequestMapping(value = "/getAgeSumAvgCountByName", method = RequestMethod.GET) @ResponseBody public Result<List<AggregateAgeSumAvgAndCountRsp>> getAgeSumAvgCountByName() { try { return Result.ok(aggregateService.getAgeSumAvgCountByName()); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
調(diào)試代碼
OK,完美。
apply方法使用
官方提供了顯示自由指定字段.apply語(yǔ)法功能。我們測(cè)試一下好不好用。
返回體定義
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; /** @Author huyi @Date 2021/10/26 15:10 @Description: 聚合應(yīng)用返回體 */ @Data @AllArgsConstructor @NoArgsConstructor @Builder public class AggregateApplyRsp { private String name; private Date createTime; private Integer minAge; private Date maxTime; }
方法實(shí)現(xiàn)
@Override public List<AggregateApplyRsp> getApply() { List<Map<String, Object>> result = testFluentMybatisMapper.listMaps( new TestFluentMybatisQuery() .select .apply("name") .createTime("createTime") .apply("min(age) as minAge", "max(create_time) as maxTime") .end() .groupBy .name() .createTime() .end()); if (result != null && result.size() != 0) { List<AggregateApplyRsp> list = new ArrayList<>(); result.forEach( x -> list.add(BeanUtil.fillBeanWithMapIgnoreCase(x, new AggregateApplyRsp(), false))); return list; } else { return null; } }
控制層代碼
@ApiOperation(value = "根據(jù)名字獲取最小年齡,使用語(yǔ)句", notes = "根據(jù)名字獲取最小年齡,使用語(yǔ)句") @RequestMapping(value = "/getApply", method = RequestMethod.GET) @ResponseBody public Result<List<AggregateApplyRsp>> getApply() { try { return Result.ok(aggregateService.getApply()); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
調(diào)試代碼
OK,完美。
總結(jié)
在調(diào)試完聚合查詢代碼后給我直觀感受是,這和寫sql沒啥區(qū)別,十分好理解。只是需要掌握f(shuō)m的select語(yǔ)法,特別是end方法的理解,可以追一下源碼看一下具體實(shí)現(xiàn)過程。
如果文章對(duì)你有幫助的話,點(diǎn)個(gè)贊吧,點(diǎn)個(gè)贊吧,點(diǎn)個(gè)贊吧,重要的事情說(shuō)三遍。
到此這篇關(guān)于Java Fluent Mybatis 聚合查詢與apply方法詳解流程篇的文章就介紹到這了,更多相關(guān)Java Fluent Mybatis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus指定字段模糊查詢的實(shí)現(xiàn)方法
- springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁(yè)并帶條件模糊查詢功能
- MyBatis中模糊查詢使用CONCAT('%',#{str},'%')出錯(cuò)的解決
- Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug
- mybatis?使用concat?模糊查詢方式
- mybatis多層嵌套resultMap及返回自定義參數(shù)詳解
- Mybatis insert方法主鍵回填和自定義操作
- 詳解MyBatis中主鍵回填的兩種實(shí)現(xiàn)方式
- Mybatis模糊查詢之三種定義參數(shù)方法和聚合查詢、主鍵回填實(shí)現(xiàn)方法
相關(guān)文章
簡(jiǎn)析Java中的util.concurrent.Future接口
這篇文章主要介紹了簡(jiǎn)析Java中的util.concurrent.Future接口,作者把future歸結(jié)為在未來(lái)得到目標(biāo)對(duì)象的占位符,需要的朋友可以參考下2015-07-07詳解Java程序并發(fā)的Wait-Notify機(jī)制
這篇文章主要介紹了詳解Java程序并發(fā)的Wait-Notify機(jī)制,多線程并發(fā)是Java編程中的重要部分,需要的朋友可以參考下2015-07-07Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法
這篇文章給大家分享了Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)單的實(shí)現(xiàn)方法,有興趣的朋友可以參考學(xué)習(xí)下。2018-07-07使用@ControllerAdvice同時(shí)配置過濾多個(gè)包
這篇文章主要介紹了使用@ControllerAdvice同時(shí)配置過濾多個(gè)包的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例
這篇文章主要介紹了Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例,Log4j是Apache的一個(gè)開源Java日志項(xiàng)目,需要的朋友可以參考下2016-01-01Java發(fā)送郵箱驗(yàn)證碼、session校驗(yàn)功能
本篇主要描述“發(fā)送郵箱驗(yàn)證碼、session校驗(yàn)”相關(guān)前(html\js)后(java)臺(tái)代碼,業(yè)務(wù)邏輯示例,需要的朋友可以參考下2018-02-02java使用反射創(chuàng)建并操作對(duì)象的方法
這篇文章主要介紹了java使用反射創(chuàng)建并操作對(duì)象的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06