zoukankan      html  css  js  c++  java
  • 转载 mybatis-plus配置控制台打印完整带参数SQL语句

    问题背景

    通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率。因此我们需要输出完整的SQL语句以便调试。

    Update

    解决方案(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]
    

    解决方案(手写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);
        }
    }
    

    解决方案(LOG-DEBUG模式)

    # 在application.yml 中增加配置,指定 mapper 文件所在的包,进入DEBUG模式
    logging:
      level:
        com.baomidou.example.mapper: debug
    

    官方解决方案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
  • 相关阅读:
    .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记
    .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
    .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记
    .NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)
    .NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(上)
    .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)
    .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(中)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)
  • 原文地址:https://www.cnblogs.com/exmyth/p/14419662.html
Copyright © 2011-2022 走看看