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
  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/exmyth/p/14419662.html
Copyright © 2011-2022 走看看