Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

作者:剑客阿良_ALiang 时间:2023-01-06 05:35:43 

前言

接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

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

GitHub代码仓库地址:GitHub仓库

准备数据

简单的准备了一些数据。

Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

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

看下执行效果

Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

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

看下执行效果。

Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

这里要注意一下,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

来源:https://huyi-aliang.blog.csdn.net/article/details/120947681

标签:Java,Fluent,Mybatis,分页查询,sql日志输出
0
投稿

猜你喜欢

  • IDEA Ui设计器JFormDesigner 永久激活插件+注册机(亲测一直在用)

    2022-10-23 18:44:46
  • springboot更新配置Swagger3的一些小技巧

    2023-08-28 06:31:43
  • Java拦截器和过滤器的区别分析

    2021-11-06 22:28:46
  • C#递归算法之快速排序

    2021-08-16 21:13:37
  • Springboot整合MybatisPlus的实现过程解析

    2021-06-14 02:47:06
  • 一文带你彻底理解Java序列化和反序列化

    2021-12-23 05:24:12
  • springboot集成JWT实现身份认证(权鉴)的方法步骤

    2023-06-02 12:57:37
  • C#中fixed关键字的作用总结

    2023-07-17 09:43:44
  • Java中URL传中文时乱码的解决方法

    2022-05-17 02:16:55
  • 深入解析Java多态进阶学习

    2022-05-16 16:06:55
  • Java使用动态规划算法思想解决背包问题

    2022-12-02 03:53:49
  • spring boot 实现配置多个DispatcherServlet最简单方式

    2023-12-18 03:24:46
  • C#使用NPOI将List数据导出到Excel文档

    2022-12-18 12:28:09
  • 详解java操作Redis数据库的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoolUtil)

    2023-07-29 11:31:36
  • Android中多个ContentProvider的初始化顺序详解

    2021-11-06 03:52:36
  • Aspectj框架实战案例详解

    2022-12-30 02:28:24
  • Java读取TXT文件内容的方法

    2023-11-23 22:33:41
  • C#使用Resources资源文件

    2023-07-04 08:42:48
  • Android双向选择控件DoubleSeekBar使用详解

    2022-02-13 10:05:29
  • flutter使用tauri实现一个一键视频转4K软件

    2022-10-23 05:46:42
  • asp之家 软件编程 m.aspxhome.com