1. 程式人生 > 程式設計 >mybatis-plus配置控制檯列印完整帶引數SQL語句的實現

mybatis-plus配置控制檯列印完整帶引數SQL語句的實現

問題背景

通常我們開發的時候,需要聯合控制檯和Navicat/PLSQL等工具進行語句的拼接檢查,如果只是輸出了一堆???,那麼將極大降低我們的效率。因此我們需要輸出完整的SQL語句以便除錯。

update 2020-July : 新增官方p6spy列印分析sql語句方案

解決方案(StdOutImpl)

請注意: 部分朋友反饋不生效,估計跟引入的包有一定關係,druid+mybatis-plus-boot-starter 就親測有用。請檢查是否有log4j相關實現類。

如果是application.yml

#by zhengkai.blog.csdn.net
#mybatis-plus配置控制檯列印完整帶引數SQL語句
mybatis-plus:
 configuration:
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

如果是application.properties,新增:

#mybatis-plus配置控制檯列印完整帶引數SQL語句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

Mybatis內建的日誌工廠提供日誌功能,具體的日誌實現有以下幾種方式:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging
  • no logging

具體選擇哪個日誌實現由MyBatis的LogFactory內建日誌工廠確定。它會使用最先找到的(按上文列舉的順序查詢)。 如果一個都未找到,日誌功能就會被禁用。

 static {
  tryImplementation(LogFactory::useSlf4jLogging);
  tryImplementation(LogFactory::useCommonsLogging);
  tryImplementation(LogFactory::useLog4J2Logging);
  tryImplementation(LogFactory::useLog4JLogging);
  tryImplementation(LogFactory::useJdkLogging);
  tryImplementation(LogFactory::useNoLogging);
 }

不少應用伺服器的classpath中已經包含Commons Logging,如Tomcat和WebShpere, 所以MyBatis會把它作為具體的日誌實現。

記住這點非常重要。這意味著,在諸如 WebSphere的環境中——WebSphere提供了Commons Logging的私有實現,你的Log4J配置將被忽略。

這種做法不免讓人悲摧,MyBatis怎麼能忽略你的配置呢?事實上,因Commons Logging已經存 在,按優先順序Log4J自然就被忽略了!

控制檯輸出

--- [ XNIO-1 task-12] c.s.cms.controller.IndexController : username-admin-password-123456-****
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@708e9ffd] was not registered for synchronization because synchronization is not active
--- [ XNIO-1 task-12] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@62b13210] will not be managed by Spring
==> Preparing: select * from user t where t.user_code='admin' and t.password='123456'
==> Parameters:
<== Columns: user_id,user_code,create_date,modify_date,user_name,password,status,role_id,department_id,major_id,classes_id,year
<== Row: 1,admin,2020-02-15 22:14:32,2020-02-18 23:38:51,Moshow K ZHENG,123456,1,9,13,113,2020
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@708e9ffd]

解決方案2(手寫一個MybatisPlusOutImpl)

配置檔案

mybatis-plus:
 configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 改為自己寫的
 log-impl: com.softdev.system.config.MybatisPlusOutImpl

java類 MybatisPlusOutImpl

package com.softdev.system.config;

import org.apache.ibatis.logging.Log;
/**
 * @Description MybatisPlusOutImpl,直接使用控制檯輸出日誌
 * @Author zhengkai.blog.csdn.net
 **/
public class MybatisPlusOutImpl implements Log {
 public MybatisPlusOutImpl(String clazz) {
  System.out.println("MybatisPlusOutImpl::"+clazz);
 }

 public boolean isDebugEnabled() {
  return true;
 }

 public boolean isTraceEnabled() {
  return true;
 }

 public void error(String s,Throwable e) {
  System.err.println(s);
  e.printStackTrace(System.err);
 }

 public void error(String s) {
  System.err.println("MybatisPlusOutImpl::"+s);
 }

 public void debug(String s) {
  System.out.println("MybatisPlusOutImpl::"+s);
 }

 public void trace(String s) {
  System.out.println("MybatisPlusOutImpl::"+s);
 }

 public void warn(String s) {
  System.out.println("MybatisPlusOutImpl::"+s);
 }
}

官方解決方案p6spy

檢視p6spy最新版本 ,請注意,該方案為侵入式的JDBC級方案。

pom.xml引入

<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
 <groupId>p6spy</groupId>
 <artifactId>p6spy</artifactId>
 <version>3.9.1</version>
</dependency>

這是yaml版本,還沒試過,待我實驗一下.

spring:
 datasource:
 driver-class-name: com.p6spy.engine.spy.P6SpyDriver
 url: jdbc:p6spy:h2:mem:test
 ...

這是官方提供的properties版本

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日誌列印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日誌輸出到控制檯
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設定 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL字首
useprefix=true
# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實際驅動可多個
#driverlist=org.h2.Driver
# 是否開啟慢SQL記錄
outagedetection=true
# 慢SQL記錄標準 2 秒
outagedetectioninterval=2

到此這篇關於mybatis-plus配置控制檯列印完整帶引數SQL語句的文章就介紹到這了,更多相關mybatis-plus 列印帶引數SQL內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!