MyBatis Plus配合p6spy控制台打印美化格式的sql语句

简介:
p6spy配合mybatis plus可以在控制台打印出指定格式已执行的sql语句,便于开发人员分析和调试。下面介绍一下p6spy的简单配置和使用

使用:
一、引入p6spy依赖包:


    p6spy
    p6spy
    3.8.1

二、在项目结构的配置资源包目录下创建名为 spy.properties 的文件,如下:


image.png

spy.properties文件的配置内容如下:

#p6spy\u914D\u7F6E\u6587\u4EF6
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
# 此为自定义指定的sql格式,配制类的全路径
logMessageFormat=com.hkl.configure.SpySqlFormatConfigure
# sql\u8F93\u51FA\u65B9\u5F0F  Slf4JLogger(\u8F93\u51FA\u5230\u65E5\u5FD7)  StdoutLogger(\u8F93\u51FA\u5230\u63A7\u5236\u53F0)
appender=com.p6spy.engine.spy.appender.StdoutLogger
## \u914D\u7F6E\u8BB0\u5F55Log\u4F8B\u5916
excludeCategories=info,debug,result,batc,resultset
# \u8BBE\u7F6E\u4F7F\u7528p6spy driver\u6765\u505A\u4EE3\u7406
deregisterDrivers=true
# \u65E5\u671F\u683C\u5F0F
dateFormat=yyyy-MM-dd HH:mm:ss
# \u5B9E\u9645\u9A71\u52A8 oracle mysql \u9A71\u52A8
driverList=com.mysql.cj.jdbc.Driver
# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
outageDetection=true
# \u6162SQL\u8BB0\u5F55\u6807\u51C6 /\u79D2
outageDetectionInterval=2

三、格式配置类 SpySqlFormatConfigure 代码:


image.png

配置方式一(推荐):

package com.hkl.configure;

import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 

ClassName:SpySqlFormatConfigure

*

Description:打印sql日志信息配置类

*

Author:

*

Date:2021/12/3

*/ @Slf4j public class SpySqlFormatConfigure implements MessageFormattingStrategy { private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** *

输出执行sql信息

* @author * @date 2021/12/3 * @param connectionId * @param now 执行时间 * @param elapsed 耗时多少毫秒 * @param category * @param prepared 准备执行的sql脚本 * @param sql 执行的sql脚本 * @param url 数据源连接地址 */ @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { String date = dateFormat.format(new Date(Long.parseLong(now))); if (log.isInfoEnabled()) { log.info("执行时间: {}", date); log.info("完整sql: {}", sql); log.info("耗时:{} 毫秒", elapsed); } return ""; } }

配置方式二:

package com.svw.newsvwuc.common.configure;
 
 
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import com.svw.newsvwuc.common.enums.Constants;
import lombok.extern.slf4j.Slf4j;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * 

ClassName: SpySqlFormatConfigure

*

Description:Spy记录sql日志

*

Date: 2021/8/5

*/ @Slf4j public class SpySqlFormatConfigure implements MessageFormattingStrategy { private static final Formatter formatter; static { formatter = new BasicFormatterImpl(); } /** * Formats a log message for the logging module * * @param connectionId the id of the connection * @param now the current ime expressing in milliseconds * @param elapsed the time in milliseconds that the operation took to complete * @param category the category of the operation * @param prepared the SQL statement with all bind variables replaced with actual values * @param sql the sql statement executed * @return the formatted log message */ @Override public String formatMessage(final int connectionId, final String now, final long elapsed, final String category, final String prepared, final String sql) { return "\n#" + now + " | took " + elapsed + "ms | " + category + " | connection " + connectionId + formatter.format(sql) +";"; } }

四、在模块yaml文件中配置数据源连接,使用p6spy代理数据库驱动(com.p6spy.engine.spy.P6SpyDriver)

  #数据源配置
  datasource:
    name: mysql
    type: com.alibaba.druid.pool.DruidDataSource
    #druid相关配置
    druid:
      #监控统计拦截的filters
      filters: stat
      #使用p6spy代理类
      driver-class-name: com.p6spy.engine.spy.P6SpyDriver
      #基本属性
      url: jdbc:p6spy:mysql://ipxxx:3306/xxx库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT&autoReconnect=true&failOverReadOnly=false
      username: xxx
      password: xxx
      #配置初始化大小/最小/最大
      initial-size: 1
      min-idle: 1
      max-active: 20
      #获取连接等待超时时间
      max-wait: 60000

五、以上步骤配置完成后,测试控制台打印sql语句自动拼接好参数,如下:

2021-10-20 14:46:08 INFO  [newsvwuc-quote-service,,,] http-nio-9004-exec-3 com.svw.newsvwuc.common.configure.SpySqlFormatConfigure 执行时间: 2021-10-20 14:46:08
2021-10-20 14:46:08 INFO  [newsvwuc-quote-service,,,] http-nio-9004-exec-3 com.svw.newsvwuc.common.configure.SpySqlFormatConfigure 完整sql: SELECT  PURCHASE_PLAN_ID,CUST_ID,CUST_NAME,CUST_PHONE,PAY_TYPE,PAY_AMOUNT,LOAN_BANK,POLICY_ID,POLICY_DURATION,PAY_RATIO,FINAL_RATIO,FIRST_PAY,RATE,MONTH_PAY,PURCHASE_TAX,OLD_CAR_NAME,OLD_CAR_BARND,OLD_CAR_BARND_NAME,OLD_CAR_SERIES,OLD_CAR_SERIES_NAME,OLD_CAR_MODEL,OLD_CAR_PLATE_NUMBER,OLD_CAR_VIN,OLD_CAR_REGISTER_DATE,OLD_CAR_MILEAGE,OLD_CAR_COLOR,OLD_CAR_COLOR_NAME,PURCH_PRICE,REPLACE_SUBSIDY,OLD_CAR_DESC,USED_CAR_PRICE,BRAND_CODE,BRAND_NAME,SERIES_CODE,SERIES_NAME,MODEL_CODE,MODEL_NAME,MODEL_YEAR,VERSION_NO,VERSION_NAME,INTERIOR_CODE,INTERIOR_NAME,COLOR_CODE,COLOR_NAME,OPTIONAL,GUIDANCE_PRICE,NEW_CAR_COUPON,COUPON_PRICE,PURCHASE_PLAN_PIC,SEATS_NO,DLR_ID,SALE_PERSON,CREATE_BY,CREATE_DATE,UPDATE_BY,UPDATE_DATE  FROM tt_purchase_plan 
 
 WHERE PURCHASE_PLAN_ID = 157 AND DLR_ID = 11
2021-10-20 14:46:08 INFO  [newsvwuc-quote-service,,,] http-nio-9004-exec-3 com.svw.newsvwuc.common.configure.SpySqlFormatConfigure 耗时:12 毫秒

说明:
1、以上配置使用方式可以放在项目的公共模块中,例如放在 server-common 模块中,可供其他多个服务模块全局共同使用
2、mybatis-plus自身的打印sql脚本 mybatis-plus.configuration.log-impl 不能开启,否则p6spy打印不生效

你可能感兴趣的:(MyBatis Plus配合p6spy控制台打印美化格式的sql语句)