mybatis-plus配置控制台打印完整带参数SQL语句的实现

作者:Moshow郑锴 时间:2023-11-24 22:43:58 

问题背景

通常我们开发的时候,需要联合控制台和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, 1, 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,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

来源:https://blog.csdn.net/moshowgame/article/details/90641657

标签:mybatis-plus,控制台,打印,参数SQL
0
投稿

猜你喜欢

  • Java操作FTP实现上传下载功能

    2021-12-07 18:35:04
  • 论C++的lambda是函数还是对象

    2022-09-24 05:16:06
  • java中的final关键字详解及实例

    2022-03-02 11:26:59
  • springCloud config本地配置操作

    2023-01-13 11:07:56
  • springboot 动态数据源的实现方法(Mybatis+Druid)

    2021-07-26 04:27:00
  • Java的关键字与保留字小结

    2021-05-30 10:20:50
  • C# Dynamic关键字之:调用属性、方法、字段的实现方法

    2022-09-22 04:23:39
  • SpringBoot整合Security安全框架实现控制权限

    2022-10-03 14:37:15
  • 解读JSONArray删除元素的两种方式

    2022-10-31 11:40:50
  • Java基础知识之CharArrayReader流的使用

    2023-02-12 10:40:29
  • Java数据结构之链表、栈、队列、树的实现方法示例

    2021-10-07 10:40:29
  • Mybatis延迟加载的实现方式

    2023-08-19 11:07:32
  • Java工具类之@RequestMapping注解

    2023-11-16 03:00:54
  • C语言实现矩阵运算案例详解

    2023-08-03 12:15:14
  • Android整理好的图片压缩工具类

    2023-11-06 03:24:19
  • SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解

    2021-10-14 16:45:44
  • Java实现过滤掉map集合中key或value为空的值示例

    2021-05-25 10:26:17
  • Feign调用可重试的最佳方案分享

    2021-06-09 12:19:23
  • android studio使用SQLiteOpenHelper()建立数据库的方法

    2023-10-28 12:50:35
  • Java单例模式简单示例

    2022-04-24 03:46:20
  • asp之家 软件编程 m.aspxhome.com