前言
接著我上一章:Java Fluent Mybatis 項目工程化與常規操作詳解流程篇 下
上一章我把項目做了一部分工程化包裝,主要還是想要之后的調試能夠方便一些。那么這一章接著上一章的內容,做一下查詢分頁,并且將每次請求所調用的sql語句寫在日志里面,便于我們觀察定位問題。代碼之后還是會上傳到github。
GitHub代碼倉庫地址:GitHub倉庫
準備數據
簡單的準備了一些數據。
Sql日志配置
之前sql日志一直沒有配置,后面隨著使用的語句愈發復雜,決定先把日志配置上。方便調試。
這部分和fm沒什么關系,如果你會配置的話,可以跳到下個標題。這里把logback.xml發出來
<configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/home/work/logs/fmp/log.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/home/work/logs/fmp/log.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>500MB</maxFileSize> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${FILE_LOG_PATTERN}</pattern> </layout> </encoder> </appender> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <File>/home/work/logs/fmp/error.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/home/work/logs/fmp/error.%d{yyyy-MM-dd}.log.%i.log.gz</fileNamePattern> <maxFileSize>500MB</maxFileSize> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${FILE_LOG_PATTERN}</pattern> </layout> </encoder> </appender> <appender name="SQL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/home/work/logs/fmp/sql.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <maxFileSize>500MB</maxFileSize> <fileNamePattern>/home/work/logs/fmp/sql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${FILE_LOG_PATTERN}</pattern> </layout> </encoder> </appender> <logger name="org.springframework.web" level="info"/> <logger name="com.hy.fmp.fluent.mapper" level="debug"> <appender-ref ref="SQL"/> </logger> <root level="info"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration>
簡單說明一下,主要是下面這部分的配置,將mapper包內的日志打出來。
<logger name="com.hy.fmp.fluent.mapper" level="debug"> <appender-ref ref="SQL"/> </logger>
官方分頁查詢
我這里先按照官方的分頁查詢使用編寫接口。官方提供的寫法是Query語句中有limit方法,和mysql的limit關鍵字一致。
先定義分頁實體
import lombok.Data; /** * @Program: fluent-mybatis-project @ClassName: PageReq @Author: huyi @Date: 2021-10-24 * 23:21 @Description: 分頁參數 @Version: V1.0 */ @Data public class PageReq { /** 每頁數量 */ private Integer size; /** 頁碼 */ private Integer page; }
這里注意,我們要按照limit的語法來,下面是接口方法實現。
參數1:指定要返回的第一行的偏移量。第一行的偏移量為0,而不是1,所以對應我們的參數就是
pageReq.getPage() * pageReq.getSize()
參數2:指定要返回的最大行數。
pageReq.getSize()
@Autowired private TestFluentMybatisMapper testFluentMybatisMapper; @Override public StdPagedList<TestFluentMybatisEntity> selectAllByPage(PageReq pageReq) { return testFluentMybatisMapper.stdPagedEntity( new TestFluentMybatisQuery() .selectAll() .limit(pageReq.getPage() * pageReq.getSize(), pageReq.getSize())); }
控制層:
@Autowired private ISelectService selectService; @ApiOperation(value = "分頁查詢所有數據", notes = "分頁查詢所有數據") @RequestMapping(value = "/selectAllPage", method = RequestMethod.POST) @ResponseBody public Result<StdPagedList<TestFluentMybatisEntity>> selectAllPage(@RequestBody PageReq pageReq) { try { return Result.ok(selectService.selectAllByPage(pageReq)); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
看下執行效果
OK,沒什么問題。看一下日志打印。
2021-10-25 11:23:55.313 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.countNoLimit : ==> Preparing: SELECT COUNT(*) FROM `test_fluent_mybatis`
2021-10-25 11:23:55.313 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.countNoLimit : ==> Parameters:
2021-10-25 11:23:55.316 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.countNoLimit : <== Total: 1
2021-10-25 11:23:55.317 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.listEntity : ==> Preparing: SELECT `id`, `age`, `create_time`, `del_flag`, `name` FROM `test_fluent_mybatis` LIMIT ?, ?
2021-10-25 11:23:55.317 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.listEntity : ==> Parameters: 2(Integer), 2(Integer)
2021-10-25 11:23:55.319 DEBUG 24688 --- [nio-8080-exec-5] c.h.f.f.m.T.listEntity : <== Total: 2
PageHelper分頁查詢
回顧一下以前分頁操作,最常用的一般都是一些分頁工具。這里我也把分頁工具方式寫一下。
添加依賴
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency>
接口方法調整一下。
@Override public PageInfo<TestFluentMybatisEntity> selectAllByPage2(PageReq pageReq) { PageHelper.startPage(pageReq.getPage(), pageReq.getSize()); return new PageInfo<>( testFluentMybatisMapper.listEntity(new TestFluentMybatisQuery().selectAll())); }
控制層代碼。
@ApiOperation(value = "分頁查詢所有數據2", notes = "分頁查詢所有數據2") @RequestMapping(value = "/selectAllPage2", method = RequestMethod.POST) @ResponseBody public Result<PageInfo<TestFluentMybatisEntity>> selectAllPage2(@RequestBody PageReq pageReq) { try { return Result.ok(selectService.selectAllByPage2(pageReq)); } catch (Exception exception) { return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null); } }
看下執行效果。
這里要注意一下,pageHelper的第一頁是1,不是0,是有區別的。看下sql日志。
2021-10-25 11:27:37.135 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity_COUNT : ==> Preparing: SELECT count(0) FROM `test_fluent_mybatis`
2021-10-25 11:27:37.136 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity_COUNT : ==> Parameters:
2021-10-25 11:27:37.139 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity_COUNT : <== Total: 1
2021-10-25 11:27:37.140 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity : ==> Preparing: SELECT `id`, `age`, `create_time`, `del_flag`, `name` FROM `test_fluent_mybatis` LIMIT ?
2021-10-25 11:27:37.140 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity : ==> Parameters: 2(Integer)
2021-10-25 11:27:37.142 DEBUG 24688 --- [nio-8080-exec-4] c.h.f.f.m.T.listEntity : <== Total: 2
總結
是使用官方方式還是pageHelper,看習慣了,都可以。
如果本文對你有幫助,請點個贊支持一下吧。
到此這篇關于Java Fluent Mybatis 分頁查詢與sql日志輸出詳解流程篇的文章就介紹到這了,更多相關Java Fluent Mybatis內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://huyi-aliang.blog.csdn.net/article/details/120947681