上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些。那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题。代码之后还是会上传到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