【第22章】MyBatis-PlusSQL分析与打印

news2024/11/14 17:17:08

文章目录

  • 前言
  • 一、p6spy简介
  • 二、示例工程
    • 1. 依赖引入
    • 2. 配置
  • 三、Spring Boot集成
    • 1. 依赖
    • 2. 配置
    • 3. 注意事项
  • 四、实战
    • 1. 依赖
    • 2. 配置(spy.properties)
    • 3. 配置类
    • 4. 测试类
    • 5. 结果
  • 总结


前言

MyBatis-Plus提供了SQL分析与打印的功能,通过集成p6spy组件,可以方便地输出SQL语句及其执行时长。本功能适用于MyBatis-Plus 3.1.0及以上版本。


一、p6spy简介

p6spy 是一个针对数据库访问进行拦截和记录的工具,它通过代理JDBC驱动程序来工作。这意味着你的应用程序可以像往常一样使用JDBC,而p6spy会在幕后记录所有的SQL语句及其执行时间。这对于开发和调试过程中的SQL优化非常有用。

p6spy不仅限于记录SQL日志,它还提供了一些高级功能,如:

  • 慢SQL检测:通过配置outagedetection和outagedetectioninterval,p6spy可以记录执行时间超过设定阈值的SQL语句。
  • 自定义日志格式:通过logMessageFormat,你可以自定义SQL日志的输出格式,包括时间戳、执行时间、SQL语句等。
  • 日志输出控制:appender配置项允许你选择日志输出到控制台、文件或日志系统。
  • p6spy是一个强大的工具,它为MyBatis-Plus用户提供了便捷的SQL分析与打印功能。通过合理配置,你可以在开发和测试阶段有效地监控和优化SQL语句。然而,由于性能损耗,建议在生产环境中谨慎使用。

二、示例工程

为了更好地理解如何使用这一功能,可以参考官方提供的示例工程:

mybatis-plus-sample-crud

1. 依赖引入

首先,需要在项目中引入p6spy依赖。以下是Maven和Gradle两种构建工具的引入方式:

Maven

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

2. 配置

接下来,需要在application.ymlapplication.properties中进行相应的配置。
application.yml

spring:
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:h2:mem:test
    # 其他数据库配置...

spy.properties

p6spy的配置文件spy.properties包含了多个配置项,以下是一些关键配置的示例:

# 模块列表,根据版本选择合适的配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定义日志格式
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

# 日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

# 取消JDBC驱动注册
deregisterdrivers=true

# 使用前缀
useprefix=true

# 排除的日志类别
excludecategories=info,debug,result,commit,resultset

# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss

# 实际驱动列表
# driverlist=org.h2.Driver

# 开启慢SQL记录
outagedetection=true

# 慢SQL记录标准(单位:秒)
outagedetectioninterval=2

三、Spring Boot集成

对于Spring Boot项目,可以使用p6spy-spring-boot-starter来简化集成过程。

1. 依赖

<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>1.9.1</version>
</dependency>

2. 配置

decorator:
  datasource:
    p6spy:
      # 日志格式
      log-format: "\ntime:%(executionTime) || sql:%(sql)\n"
      # 自定义日志类
      logging: custom
      custom-appender-class: com.example.testinit.config.StdoutLogger
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger {
    public void logText(String text) {
        System.err.println(text);
    }
}

更多关于p6spy-spring-boot-starter的配置信息,请参考GitHub。

3. 注意事项

  • driver-class-name应配置为p6spy提供的驱动类。
  • url前缀应为jdbc:p6spy,后跟实际的数据库连接地址。
  • 如果打印的SQL为null,请在excludecategories中增加commit
  • 如果批量操作不打印SQL,请去除excludecategories中的batch
  • 对于批量操作打印重复的问题,请使用MybatisPlusLogFactory(3.2.1新增)。
  • 请注意,该插件可能会带来性能损耗,不建议在生产环境中使用。

四、实战

1. 依赖

<!-- https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter -->
<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>1.9.1</version>
</dependency>

2. 配置(spy.properties)

# 模块列表,根据版本选择合适的配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志格式
logMessageFormat=org.example.springboot3.mybatisplus.util.P6SpyLogger
# 日志输出到控制台(default is com.p6spy.engine.spy.appender.FileLogger)
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
#appender=com.p6spy.engine.spy.appender.StdoutLogger
#appender=com.p6spy.engine.spy.appender.FileLogger
#自定义输出
appender=org.example.springboot3.mybatisplus.util.StdoutLogger
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 开启慢查询日志
outagedetection=true
outagedetectioninterval=2
# 自定义日志文件名
logfile=spy.log
append=true

3. 配置类

P6SpyLogger

package org.example.springboot3.mybatisplus.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;

/**
 * Create by zjg on 2024/7/6
 */
public class P6SpyLogger implements MessageFormattingStrategy {
    @Override
    public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
        String text = StringUtils.isNotBlank(sql) ? " Consume Time:" + elapsed + " ms " + now + "\n Execute SQL:" + sql.replaceAll("[\\s]+", " ") : "";;
        if(elapsed>1000){
            System.err.println(text);
            text="";
        }
        return text;
    }
}

StdoutLogger

package org.example.springboot3.mybatisplus.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

/**
 * Create by zjg on 2024/7/6
 */
@Slf4j
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger {
    public void logText(String text) {
        if(StringUtils.hasLength(text)){
            log.debug(text);
        }
    }
}

4. 测试类

package org.example.springboot3.mybatisplus.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.example.springboot3.mybatisplus.model.User;
import org.example.springboot3.mybatisplus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

/**
 * Create by zjg on 2024/7/6
 */
@Slf4j
@RestController
@RequestMapping("/p6spy/")
public class P6SpyController {
    @Autowired
    UserService userService;
    @RequestMapping("list")
    public void list() {
        // 查询所有用户
        LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class).isNotNull(User::getName).isNotNull(User::getId).orderByAsc(User::getId).orderByAsc(User::getName);
        List<User> users = userService.list(queryWrapper);// 调用 list 方法
        log.debug(String.valueOf(users.size()));
    }
}

5. 结果

在这里插入图片描述
在这里插入图片描述


总结

回到顶部

通过以上步骤,你就可以在开发过程中方便地分析和打印SQL语句了。记得根据实际需要调整配置,以达到最佳的使用效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑找回彻底删除文件?四个实测效果的方法【一键找回】

电脑数据删除了还能恢复吗&#xff1f;可以的&#xff0c;只要我们及时撤销上一步删除操作&#xff0c;还是有几率找回彻底删除文件。 当我们的电脑文件被彻底删除后&#xff0c;尽管恢复的成功率可能受到多种因素的影响&#xff0c;但仍有几种方法可以尝试找回这些文件。本文整…

白帽工具箱:DVWA中CSRF攻击与防御的入门指南

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

镜舟科技:国产数据库角逐金融赛道,开年斩获数家银行订单

在国产数据库领域&#xff0c;镜舟科技正迅速崛起&#xff0c;成为一匹瞩目的基础数据技术黑马。 开年伊始&#xff0c;镜舟科技便成功斩获中信银行、南京银行、某股份制银行、某头部民营银行、某大型综合类券商以及某消费金融公司等多家金融企业订单&#xff0c;其锚定需求匹…

最优化方法 运筹学【】

1.无约束 常用公式 线搜索准则&#xff1a;求步长 精确线搜索&#xff08;argmin&#xff09; 最速下降&#xff1a;sd&#xff1a;线性收敛 2.算法 SD dk&#xff1a;付梯度-g newton dk&#xff1a;Gkd-g 二阶收敛&#xff0c;步长为1 阻尼牛顿&#xff1a;步长用先搜…

HBuilder X 小白日记03-用css制作简单的交互动画

:hover选择器&#xff0c;用于选择鼠标指针浮动在上面的元素。 :hover选择器可用于所有元素&#xff0c;不只是链接 :link选择器 设置指向未被访问页面的链接的样式 :visited选择器 用于设置指向已被访问的页面的链接 :active选择器 用于活动链接

【Java14】构造器

Java中的构造器在创建对象&#xff08;实例&#xff09;的时候执行初始化。Java类必须包含一个或一个以上的构造器。 Java中的构造器类似C中的构造函数。 Java中对象&#xff08;object&#xff09;的默认初始化规则是&#xff1a; 数值型变量初始化为0&#xff1b;布尔型变量…

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf&#xff1a;配置文件目录log&#xff1a;日志文件目录html&#xff1a;项目文件目录&#xff08;这里可以存放web文件&#xff09; 创建挂…

智能视频监控中心 - 详细介绍

目录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;作用 1、系统安全性 2、整体管理效率 3、数据支持决策 4、促进企业集团化和智慧城市发展 二、原理和组成 &#xff08;一&#xff09;原理 &#xff08;二&#xff09;组网图 &#xff08;…

MATLAB常用的插值方法

在数学建模中&#xff0c;我们拿到的数据经常会有缺失值&#xff0c;在缺失值不是很多的情况下&#xff0c;我们在数据预处理阶段会采用插值方法来将数据补齐&#xff0c;之后再开始我们的建模。 目录 1.Matlab 实现分段线性插值 2.拉格朗日插值多项式 3.牛顿&#xff08;…

OSCNET+ 代码复现

项目github 已有&#xff0c;开个博客大家如果复现有问题可以随时在下面留言 github &#xff1a;GitHub - hongwang01/OSCNet: 【MICCAI 2022, TMI 2023】Orientation-Shared Convolution Representation Model 1、从github 下载项目并解压 2、下载数据集 当然自己用肯定是自…

C语言实现顺序表字符型数据排序

实现直接插入、冒泡、直接选择排序算法。 #include <stdio.h> #include <stdlib.h>typedef char InfoType;#define n 10 //假设的文件长度&#xff0c;即待排序的记录数目 typedef char KeyType; //假设的关键字类型 typedef struct { //记录类型KeyType…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

Mac系统清理工具:您的数字生活杂务处理师

有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样&#xff1f;随着我们不断使用电脑&#xff0c;各种不需要的文件、老旧的数据和忘记的安装包就像家里的灰尘一样慢慢积累。幸运的是&#xff0c;有了一些出色的Mac系统清理工具&#xff0c;我们可以轻松将这些数字灰尘拂…

含金废水的特性?如何提取含金废液中的黄金?

在金的工业使用过程和回收过程中都会产生含金废液&#xff0c;通常来自金矿冶炼、电子废弃物处理、珠宝制作和其他工业过程。由于黄金是一种贵重的贵金属&#xff0c;金废水的回收和处理是环保和资源可持续利用的关键领域之一&#xff0c;但是金的含量多数较低、甚至是微量、痕…

华为od相关信息分享

2024年OD统一考试&#xff08;D卷&#xff09;完整题库&#xff1a;华为OD机试2024年最新题库&#xff08;Python、JAVA、C合集&#xff09; 问 1.什么是华为od&#xff1f; 答&#xff1a;OD全称是Outsourcing Dispacth&#xff0c;即外包派遣&#xff0c;是华为和外企德科…

昇思MindSpore学习笔记5-02生成式--RNN实现情感分类

摘要&#xff1a; 记录MindSpore AI框架使用RNN网络对自然语言进行情感分类的过程、步骤和方法。 包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型测试等。 一、概念 情感分类。 RNN网络模型 实现效果&#xff1a; 输入: This film is terrible 正…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-1.引言

今年早些时候&#xff0c;2月份举办的全球计算机存储顶会USENIX FAST 2024&#xff0c;最佳论文来自阿里云&#xff0c;论文名称《What’s the Story in EBS Glory: Evolutions and Lessons in Building Cloud Block Store》 &#xff0c;论文详尽地探讨了阿里云在过去十年中开…

新增多种图表类型,新增插件管理模块,DataEase开源数据可视化分析工具v2.8.0发布

2024年7月8日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.8.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增组合图、热力地图、符号地图、K线图等图表类型&#xff0c;并对已有的仪表盘、明细表、指标卡、富文本等图表类型进行了功…

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人&#xff0c;被誉为“Java之父”的James Gosling&#xff0c;近日在社交媒体上宣布了自己正式退休的消息。Gosling表示&#xff1a;“我终于退休了。做了这么多年的软件工程师&#xff0c;现在是时候享受人生了。”他透露&#xff0c;在亚马逊的过去7年是非…