- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java Fluent Mybatis 分页查询与sql日志输出详解流程篇由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 。
上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些。那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题。代码之后还是会上传到github.
GitHub代码仓库地址:GitHub仓库 。
。
简单的准备了一些数据.
。
之前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*/@Datapublic class PageReq {/** 每页数量 */private Integer size;/** 页码 */private Integer page;}
这里注意,我们要按照limit的语法来,下面是接口方法实现.
参数1:指定要返回的第一行的偏移量。第一行的偏移量为0,而不是1,所以对应我们的参数就是 。
pageReq.getPage() * pageReq.getSize()
参数2:指定要返回的最大行数.
pageReq.getSize()
@Autowired private TestFluentMybatisMapper testFluentMybatisMapper;@Overridepublic 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)@ResponseBodypublic 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 。
。
回顾一下以前分页操作,最常用的一般都是一些分页工具。这里我也把分页工具方式写一下.
添加依赖 。
<!-- 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>
接口方法调整一下.
@Overridepublic 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)@ResponseBodypublic 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 。
最后此篇关于Java Fluent Mybatis 分页查询与sql日志输出详解流程篇的文章就讲到这里了,如果你想了解更多关于Java Fluent Mybatis 分页查询与sql日志输出详解流程篇的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1.概述 转载:MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质
1.概述 转载:核心配置综述之StatementHandler 2.MyBatis 四大组件之StatementHandler StatementHandler 是四大组件中最重要的一个对象,负责操作
1.概述 转载:MyBatis 启动流程 MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。My
1.概述 转载:MyBatis 基础搭建及架构概述 2.MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、
1.概述 转载:核心配置综述之 ParameterHandler MyBatis 四大核心组件我们已经了解到了两种,一个是 Executor ,它是MyBatis 解析SQL请求首先会经过的第一道关卡
1.概述 转载:核心配置综述之 ResultSetHandler 我们之前介绍过了MyBatis 四大核心配置之 Executor、StatementHandler、 ParameterHandler
如果我使用mybatis,我可以很容易地得到更新的行数,就像 update table set desc = 'xxx' where name = ? 但是,如果我想获取更新的行数,而不是计数,我该如
如何在MyBatis 3中使用小于等于 SELECT * FROM( SELECT * FROM TABLE1 WHERE COL1 =#{COL1,jdbc
我将 mybatis3.0.6 与 java 一起使用 哪个性能更好? [select id="getData" parameterType="Integer" resultType="Integer
我无法在 mybatis 中使用动态排序类型创建 SQL,如下例 select user_profile.user_profile_id, user_profile.first_name
这是一个流行的例子。 insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL )values (
我下载了MyBatis,文件夹中有一个mybatis-3.0.4-javadoc.jar,我解压并打开它,但它几乎是空的。 哪里可以找到MyBatis的API文档? 最佳答案 http://repo1
我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。 packa
目录 依赖 配置 CodeGenerator mybatis-plus-generator + clickhouse 自动生成代码 依赖
目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus
例如,我有查询从员工中选择 ID、姓名、年龄、地址,而不是拥有员工对象列表。我希望有一个 map 列表,如 list{ map{ ("id", 123), ("name","jac
我在使 MyBatis (3.4.6) 工作时遇到一些麻烦。 我已将 mybatis-config.xml 文件放置在项目的 src/main/resources 文件夹中,但是当我运行单元测试时,出
我现在使用 Mybatis 和 spring-boot。我没有添加mybatis-config.xml。我根据说明通过 application.properties 为数据源和 mybatis 进行所
这是我的第一篇文章,用我糟糕的英语...... 我使用的是MyBatis3.0 在查询中,我使用 SqlBuilder 的方法如下: public class DataStatisticSqlBuil
主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter 内容: 大家好, 我一直在寻找解决我近乎简单的 MyBatis 问题的方法: 给定代码(仅必要部分):
我是一名优秀的程序员,十分优秀!