java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus SQL打印

MyBatis-Plus中SQL分析与打印

作者:你知道“铁甲小宝”吗丶

MyBatis-Plus通过集成p6spy实现SQL分析与打印,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

一、p6spy简介

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

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

二、示例工程

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

mybatis-plus-sample-crud

1. 依赖引入

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

<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. 注意事项

四、实战

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语句了。记得根据实际需要调整配置,以达到最佳的使用效果。

到此这篇关于MyBatis-Plus中SQL分析与打印的文章就介绍到这了,更多相关MyBatis-Plus SQL打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文