Java Fluent Mybatis 分页查询与sql日志输出详解流程篇
作者:剑客阿良_ALiang 发布时间:2023-01-06 05:35:43
前言
接着我上一章: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
来源:https://huyi-aliang.blog.csdn.net/article/details/120947681


猜你喜欢
- 1.1 解决方案名和项目名上右键——重命名如下图:改完后效果如下:1.2 接下来要改名 代码中的名称
- 本文实例讲述了java设置session过期时间的实现方法,分享给大家供大家参考。具体实现方法如下:1、Timeout in the dep
- 前言本文基于 RxJava 和 Retrofit 库,设计并实现了一种用于大文件分块上传的工具,并对其进行了全面的拆解分析。抛砖引玉,对同样
- spring boot版本和spring cloud版本框架版本SpringBoot2.3.12.RELEASESpringCloudHox
- 前言CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配
- 最近在开发的过程中,遇到了一个需要截取屏幕保存为图片的需求,具体为截取webview的视图保存图片。方法1:首先想到的思路是利用SDK提供的
- 公司的研发管理平台实现了Gitlab+Kubernetes的Devops,在ToB和ToC场景中,由于用户量大,且预发布环境和生产环境或多或
- JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和
- IDEA版本:2020.3具体步骤一、开启IDEA的自动编译【静态】1.File->Settings。2.直接搜索Compiler,选
- 先给大家展示下效果图,如果感觉不错,请参考实现思路详解Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安
- 先来看问题纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相
- Android MotionEvent中getX()和getRawX()的区别实例详解实例代码:public class Res exten
- 1.登录腾讯云点击登录选择浏览器登录。输入用户名 按回车键 然后输入 密码。2.安装java环境直接命令:yum -y install ja
- 开门见山 项目运行的环境里面已经有该项目的所有代码依赖,所以项目的代码只要将自己的代码打入进去就能提交到环境中运行了。但是不好的地方就是项
- 不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,
- 零、业务逻辑Controller-->service接口-->serviceImpl-->dao接口-->daoIm
- 这两个update都是使用generator生成的mapper.xml文件中,对dao层的更新操作update更新传回数据的所有字段,没有传
- 1、基础知识:Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。2、使用介绍1)、DOM(1)简介由W3C(org.w
- 我们在做微服务时,有时候需要将微服务做一些限制,比如只能我们自己的服务调用,不能通过浏览器直接调用等。我们可以使用spring cloud
- 上篇文章中我们介绍了浅谈Spring的两种配置容器,接下来我们就了解下spring中的FactoryBean的相关内容,具体如下。从Sess