开发者

MyBatis-Plus中SQL分析与打印

目录
  • 前言
  • 一、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-samplandroide-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:%(executionTphpime) || 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-starterjavascript -->
    <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.ewww.devze.comxample.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/python")
    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. 结果

    MyBatis-Plus中SQL分析与打印

    MyBatis-Plus中SQL分析与打印

    总结

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

    到此这篇关于MyBatis-Plus中SQL分析与打印的文章就介绍到这了,更多相关MyBatis-Plus SQL打印内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜