一、前言

在开发的过程中,总希望方法执行完了可以看到完整是sql语句,从而判断执行的是否正确,所以就希望有一个可以打印sql语句的插件。p6spy就是一款针对数据库访问操作的动态监控框架,他可以和数据库无缝截取和操纵,而不必对现有应该用程序的代码做任何修改。

通过p6spy可以直接打印数据库执行的语句,下面向大家介绍一下p6spy。

二、使用p6spy,需要什么?

  • p6spy的jar包

  • spy.properties

  • 自定义日志格式

  • 修改相关配置文件

三、使用过程

3.1 添加p6spy的依赖

      <!--打印数据库SQL语句--><dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.6.0</version></dependency>

3.2 修改Dao相关配置文件

在连接数据源的配置文件中,添加p6spy连接设置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"><!--p6spy连接设置--><bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource"><constructor-arg><ref bean="dataSourceDefault"/></constructor-arg></bean><!-- 数据库连接池 --><!-- 加载配置文件 --><context:property-placeholder location="classpath:conf/db.properties" /><!-- 数据库连接池 --><bean id="dataSourceDefault" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><!-- 基本属性 url username password driverClassName--><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><!--<property name="driverClassName" value="${jdbc.driver}" />--><!--配置初始化大小、最小、最多连接数--><property name="initialSize" value="1"/><property name="maxActive" value="100" /><property name="minIdle" value="5" /><!--配置获取连接等待超时时间--><property name="maxWait" value="3000"/><!--配置间隔多久进行一次检测,检测需要关闭的空闲连接,单位是毫秒--><property name="timeBetweenEvictionRunsMillis" value="6000"/><!--配置一个连接在连接池中,最小生存的时间,单位是毫秒--><property name="minEvictableIdleTimeMillis" value="30000"/><property name="validationQuery" value="SELECT 'x'" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!--打开PSCache,并且指定每个连接上的PSCache的大小--><property name="poolPreparedStatements" value="true"/><property name="maxPoolPreparedStatementPerConnectionSize" value="20"/><!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --><property name="filters" value="stat" /></bean><!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 数据库连接池 --><property name="dataSource" ref="dataSource" /><!-- 加载mybatis的全局配置文件 --><property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.dmsd.dao" /></bean>
</beans>

3.2 添加spy.properties

文件内容如下:

###
# #%L
# P6Spy
# %%
# Copyright (C) 2013 P6Spy
# %%
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# #L%
###
#################################################################
# P6Spy Options File                                            #
# See documentation for detailed instructions                   #
# http://p6spy.github.io/p6spy/2.0/configandusage.html          #
#################################################################
#################################################################
# MODULES                                                       #
#                                                               #
# Module list adapts the modular functionality of P6Spy.        #
# Only modules listed are active.                               #
# (default is com.p6spy.engine.logging.P6LogFactory and         #
# com.p6spy.engine.spy.P6SpyFactory)                            #
# Please note that the core module (P6SpyFactory) can't be     #
# deactivated.                                                  #
# Unlike the other properties, activation of the changes on     #
# this one requires reload.                                     #
#################################################################
#modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
################################################################
# CORE (P6SPY) PROPERTIES                                      #
################################################################
# A comma separated list of JDBC drivers to load and register.
# (default is empty)
#
# Note: This is normally only needed when using P6Spy in an
# application server environment with a JNDI data source or when
# using a JDBC driver that does not implement the JDBC 4.0 API
# (specifically automatic registration).
#driverlist=
driverlist=com.mysql.jdbc.Driver
# for flushing per statement
# (default is false)
#autoflush = false
# sets the date format using Java's SimpleDateFormat routine.
# In case property is not set, miliseconds since 1.1.1970 (unix time) is used (default is empty)
#dateformat=
# prints a stack trace for every statement logged
#stacktrace=false
# if stacktrace=true, specifies the stack trace to print
#stacktraceclass=
# determines if property file should be reloaded
# Please note: reload means forgetting all the previously set
# settings (even those set during runtime - via JMX)
# and starting with the clean table
# (default is false)
#reloadproperties=false
reloadproperties=true
# determines how often should be reloaded in seconds
# (default is 60)
#reloadpropertiesinterval=60
# specifies the appender to use for logging
# Please note: reload means forgetting all the previously set
# settings (even those set during runtime - via JMX)
# and starting with the clean table
# (only the properties read from the configuration file)
# (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=com.p6spy.engine.spy.appender.Slf4JLogger
# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log)
# (used for com.p6spy.engine.spy.appender.FileLogger only)
# (default is spy.log)
#logfile = spy.log
# append to the p6spy log file. if this is set to false the
# log file is truncated every time. (file logger only)
# (default is true)
#append=true
# class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat)
#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
#自定义日志格式,在类中定义
logMessageFormat= com.dmsd.tool.P6SpyLogger
# format that is used for logging of the date/time/... (has to be compatible with java.text.SimpleDateFormat)
# (default is dd-MMM-yy)
#databaseDialectDateFormat=dd-MMM-yy
databaseDialectDateFormat=yyyy-MM-dd HH:mm:ss
# whether to expose options via JMX or not
# (default is true)
#jmx=true
# if exposing options via jmx (see option: jmx), what should be the prefix used?
# jmx naming pattern constructed is: com.p6spy(.<jmxPrefix>)?:name=<optionsClassName>
# please note, if there is already such a name in use it would be unregistered first (the last registered wins)
# (default is none)
#jmxPrefix=
#################################################################
# DataSource replacement                                        #
#                                                               #
# Replace the real DataSource class in your application server  #
# configuration with the name com.p6spy.engine.spy.P6DataSource #
# (that provides also connection pooling and xa support).       #
# then add the JNDI name and class name of the real             #
# DataSource here                                               #
#                                                               #
# Values set in this item cannot be reloaded using the          #
# reloadproperties variable. Once it is loaded, it remains      #
# in memory until the application is restarted.                 #
#                                                               #
#################################################################
#realdatasource=/RealMySqlDS
#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
#################################################################
# DataSource properties                                         #
#                                                               #
# If you are using the DataSource support to intercept calls    #
# to a DataSource that requires properties for proper setup,    #
# define those properties here. Use name value pairs, separate  #
# the name and value with a semicolon, and separate the         #
# pairs with commas.                                            #
#                                                               #
# The example shown here is for mysql                           #
#                                                               #
#################################################################
#realdatasourceproperties=port;3306,serverName;myhost,databaseName;jbossdb,foo;bar
#################################################################
# JNDI DataSource lookup                                        #
#                                                               #
# If you are using the DataSource support outside of an app     #
# server, you will probably need to define the JNDI Context     #
# environment.                                                  #
#                                                               #
# If the P6Spy code will be executing inside an app server then #
# do not use these properties, and the DataSource lookup will   #
# use the naming context defined by the app server.             #
#                                                               #
# The two standard elements of the naming environment are       #
# jndicontextfactory and jndicontextproviderurl. If you need    #
# additional elements, use the jndicontextcustom property.      #
# You can define multiple properties in jndicontextcustom,      #
# in name value pairs. Separate the name and value with a       #
# semicolon, and separate the pairs with commas.                #
#                                                               #
# The example shown here is for a standalone program running on #
# a machine that is also running JBoss, so the JDNI context     #
# is configured for JBoss (3.0.4).                              #
#                                                               #
# (by default all these are empty)                              #
#################################################################
#jndicontextfactory=org.jnp.interfaces.NamingContextFactory
#jndicontextproviderurl=localhost:1099
#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.nameing:org.jnp.interfaces
#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory
#jndicontextproviderurl=iiop://localhost:900
################################################################
# P6 LOGGING SPECIFIC PROPERTIES                               #
################################################################
# filter what is logged
# please note this is a precondition for usage of: include/exclude/sqlexpression
# (default is false)
#filter=false
# comma separated list of strings to include
# please note that special characters escaping (used in java) has to be done for the provided regular expression
# (default is empty)
#include =
# comma separated list of strings to exclude
# (default is empty)
#exclude =
# sql expression to evaluate if using regex
# please note that special characters escaping (used in java) has to be done for the provided regular expression
# (default is empty)
#sqlexpression =
#list of categories to exclude: error, info, batch, debug, statement,
#commit, rollback and result are valid values
# (default is info,debug,result,resultset,batch)
#excludecategories=info,debug,result,resultset,batch
excludecategories=info,debug,result,resultset
# Execution threshold applies to the standard logging of P6Spy.
# While the standard logging logs out every statement
# regardless of its execution time, this feature puts a time
# condition on that logging. Only statements that have taken
# longer than the time specified (in milliseconds) will be
# logged. This way it is possible to see only statements that
# have exceeded some high water mark.
# This time is reloadable.
#
# executionThreshold=integer time (milliseconds)
# (default is 0)
#executionThreshold=
################################################################
# P6 OUTAGE SPECIFIC PROPERTIES                                #
################################################################
# Outage Detection
#
# This feature detects long-running statements that may be indicative of
# a database outage problem. If this feature is turned on, it will log any
# statement that surpasses the configurable time boundary during its execution.
# When this feature is enabled, no other statements are logged except the long
# running statements. The interval property is the boundary time set in seconds.
# For example, if this is set to 2, then any statement requiring at least 2
# seconds will be logged. Note that the same statement will continue to be logged
# for as long as it executes. So if the interval is set to 2, and the query takes
# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals).
#
# outagedetection=true|false
# outagedetectioninterval=integer time (seconds)
#
# (default is false)
#outagedetection=false
# (default is 60)
#outagedetectioninterval=30

注意:

在文档中,自定义日志格式,logMessageFormat= com.dmsd.tool.P6SpyLogger,在类中定义,指明了路径,在跳转第三步,需要自己定义。

3.3 创建P6SpyLogger类,自定义日志格式

因为这个都会使用,所以就定义在了tool工具类里:

package com.dmsd.tool;import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import java.text.SimpleDateFormat;
import java.util.Date;public class P6SpyLogger implements MessageFormattingStrategy {private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");public P6SpyLogger() {}@Overridepublic String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {return !"".equals(sql.trim())?this.format.format(new Date()) + " | took " + elapsed + "ms | " + category + " | connection " + connectionId + "\n " + sql + ";":"";}
}

3.5 运行结果对比

没有使用:什么都没有,看的不清晰。

使用之后:

四、小结

通过测试使用,提高了自己的代码能力,也从一定方向上,提升了思考问题的能力。有的时候就需要我们用工具去解决问题,程序员的创造力是无穷的。

【p6spy】程序员开发利器P6spy——打印执行sql语句,mybatis、ibatis、Hibernate均可使用相关推荐

  1. mybatis log4j 在日志中打印sql_SpringBoot整合MyBatis+详细打印执行SQL语句

    图片来源网路 为啥写这篇文章呢,有人可能会说springBoot的mybatis的starter都有了写这篇文章不是多此一举吗?难道是真的吗?其实我一开始也是使用mybatis的starter的,但是 ...

  2. 解放程序员双手!GPT-3自动生成SQL语句 | 代码开源

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI "无所不能"的GPT-3,现在又来解放程序员们的双手了. 像这样,只需用简单的英文问下GPT-3"上个月注册了 ...

  3. 程序员开发利器:源代码管理的十条建议

    英文原版 http://java.dzone.com/articles/10-commandments-good-source 本文转自中文翻译改写版  http://tech.it168.com/a ...

  4. 程序员开发常用英语词汇汇总,满满的干货!

    "我英语不好可以学编程吗"相信这个问题,困扰着太多想学习编程,但英文不好的同学. 学习编程,常用的单词就那么多,只要把常见的单词学会,你的代码就能写的很6,英语和编程的关系就是这么 ...

  5. 程序员开发必备英语基础–狂神版

    程序员开发必备英语基础–狂神版 一.开发常用英语词汇排序 A array数组 accessible 可存取的 area面积 audio 音频 addition 加法 action 行动 arithme ...

  6. 百度程序员开发避坑指南(3)

    前两期我们分享了日常工作中前端.移动端开发的相关问题,感兴趣的同学可以在文末推荐阅读跳转查看.本期我们分享三个议题:golang对象池减少gc压力.FFmpeg中的并发控制.paddle的静态图和动态 ...

  7. 2017年秋招美团Java程序员开发,看我如何拿到offer

    转载自  2017年秋招美团Java程序员开发,看我如何拿到offer 本人是一名本科毕业非计算机专业的程序员,面了阿里,结果没过,最后面上了美团,热乎乎的面经,昨天面的美团,虽然面完了HR面,但是感 ...

  8. 程序员开发软件的意义到底在哪?

    有一篇热文<写了 8 年的代码,做过的项目都下线了,程序员的意义在哪里!>,作者 8 年工作和业余时间开发几十个项目,几乎都关闭了. 想当初,很用心的去开发每一个项目:如今,这些项目只能一 ...

  9. PHP程序员开发win32应用程序之梦

    相信做纯WEB开发的PHP程序员都会想过,要是PHP能开发windows本地应用程序多好,于是上网一查找出来的很多都是"PHP-GTK"的老文章,这东西好像已经没人维护了,随便看了 ...

  10. 2017年美团Java程序员开发,看我如何拿到offer

    2017年美团Java程序员开发,看我如何拿到offer 热乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.三面技术面面经如下: 一面: 中间省略掉大概几个问题 ...

最新文章

  1. 黄聪:IE6下用控制图片最大显示尺寸
  2. python append 浮点数 精度_Python打牢基础,从12个语法开始!
  3. Solr5.3.1通过copyField设置多个field(字段)同时检索
  4. SpringMVC的请求-获得请求参数-参数绑定注解@RequestParam
  5. HanLPTokenizer HanLP分词器
  6. android.mk 比较字变量,粉丝投稿 | 谈谈Android.mk
  7. 50年代黄岩师专_300多位30、40和50年代获得第一份技术工作的开发人员的故事
  8. NumPy Beginner's Guide 2e 带注释源码 五、处理 NumPy 矩阵和 ufunc
  9. 计算机操作基本知识公务员,公务员计算机类操作系统知识.pdf
  10. Java内存模型与共享变量可见性
  11. 学用 ASP.Net 之 字符串 (3): string 类的非扩展方法
  12. Django url管理之include
  13. 驱动精灵w8ndows xp sp2,爱普生Epson TM-U220打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  14. c语言怎么对大数求余,C语言:大数取余
  15. 保龄球计分java代码_保龄球记分程序用C#该怎么写
  16. 仿京东详情页商品图片查看
  17. 机器学习中用到的概率知识_学习机器学习前,你首先要掌握这些概率论基础知识...
  18. java中时间的转换相关问题整理
  19. 10.java基础----继承、抽象类- 编程
  20. 网易中国创业家大赛倒计时,2017年8月报名结束

热门文章

  1. WINCC 应用与提高(78讲15.98G)视频教程网盘下载
  2. QTreeView 和QTreeWidget
  3. win 10 使用技巧总结
  4. 查看kms服务器信息,查看kms服务器地址
  5. vue-pdf 字体不显示
  6. 手把手教你用Python操纵Word自动编写离职报告
  7. python 绝对值_Python绝对值– abs()
  8. 科赫雪花c语言程序设计,用 C 语言画科赫雪花
  9. Linux之/etc/fstab文件详解及实践
  10. OA集成新标杆 10oa系统集成能力不容小觑