当前位置: 首页 > news >正文

spring boot 整合mybatis 无法输出sql的问题

使用spring boot整合mybatis,测试功能的时候,遇到到了sql问题,想要从日志上看哪里错了,但是怎么都无法输出执行的sql,我使用的是log4j2,百度了一下,很多博客都说,加上下面的日志配置:


        <logger name="java.sql.Statement" level="debug"/>
        <logger name="java.sql.PreparedStatement" level="debug"/>
        <logger name="java.sql.Connection" level="debug"/>
        <logger name="ResultSet" level="debug"/>

经实际测试,没什么用。只好去官网找解决方案,在mybatis日志上看到,如果存在内置日志,就是用内置的日志,自己配置的日志就忽略了。

MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

     
不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging,所以在这种配置环境下的 MyBatis 会把它作为日志工具,记住这点非常重要。这将意味着,在诸如 WebSphere 的环境中,它提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。MyBatis 将你的 Log4J 配置忽略掉是相当令人郁闷的(事实上,正是因为在这种配置环境下,MyBatis 才会选择使用 Commons Logging 而不是 Log4J)。如果你的应用部署在一个类路径已经包含 Commons Logging 的环境中,而你又想使用其它日志工具,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择别的日志工具。

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J"/>
    ...
  </settings>
</configuration>
      
     
logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口 org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。(译者注:可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)

所以我就创建了一个mybatis-config文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="LOG4J2"/>
    </settings>
</configuration>

配置mybatis:

mybatis:
  type-aliases-package: com.demo
  mapper-locations: classpath:mapper/*.xml
  configuration:
    cache-enabled: true
    lazy-loading-enabled: true
    multiple-result-sets-enabled: true
    default-executor-type: simple
    default-statement-timeout: 25000
    
  config-location: classpath:mybatis-config.xml

然而启动的时候报错:

aused by: java.lang.IllegalStateException: Property 'configuration' and 'configLocation' can not specified with together
    at org.springframework.util.Assert.state(Assert.java:73) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:377) ~[mybatis-spring-1.3.2.jar:1.3.2]
    at org.mybatis.spring.SqlSessionFactoryBean.getObject(SqlSessionFactoryBean.java:547) ~[mybatis-spring-1.3.2.jar:1.3.2]
    at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.sqlSessionFactory(MybatisAutoConfiguration.java:153) ~[mybatis-spring-boot-autoconfigure-1.3.2.jar:1.3.2]
    at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$8eb42bd5.CGLIB$sqlSessionFactory$0(<generated>) ~[mybatis-spring-boot-autoconfigure-1.3.2.jar:1.3.2]
    at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$8eb42bd5$$FastClassBySpringCGLIB$$1132516e.invoke(<generated>) ~[mybatis-spring-boot-autoconfigure-1.3.2.jar:1.3.2]
    

报错信息说configuration和configLocation不能同时存在,所以我就想两个功能一定是相同的,只不过配置方式不一样,一个是xml,一个是spring boot的风格,所以我就删掉了config-location,在configuration下面找到了一个log-impl,加上这个配置之后,问题就解决了,如下:

mybatis:
  type-aliases-package: com.demo
  mapper-locations: classpath:mapper/*.xml
  configuration:
    cache-enabled: true
    lazy-loading-enabled: true
    multiple-result-sets-enabled: true
    default-executor-type: simple
    default-statement-timeout: 25000
    log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl

输出日志:

 ==>  Preparing: select prodid,prodname,isgroupinsur,isdtbprod from bx_product where prodid in ( 1 , 2 , 3 ) 
 ==> Parameters: 
<==      Total: 0

只要加这个配置就能解决问题了。

相关文章:

  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 动态魔术使用DBMS_SQL
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • 接力10G,25G将成为数据中心首选解决方案
  • Redash本地开发环境搭建
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • Chrome 被曝 0day 漏洞,可让黑客获取用户数据
  • Linux权限管理(week1_day5)--技术流ken
  • 基于ArcFace2.0+红外双目摄像头的活体检测 [Windows][C#][.NET][WPF]
  • Android 架构优化~MVP 架构改造
  • python列表,字典,集合
  • 关于移动端页面在手机调整字体大小后无法正常显示(已解决)
  • 一位90后的自述:如何从年薪3w到30w
  • POJ 2594 Treasure Exploration(最小可相交路径覆盖)题解
  • Docker下部署自己的LNMP工作环境
  • [译]Python中的类属性与实例属性的区别
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2019.2.20 c++ 知识梳理
  • canvas 五子棋游戏
  • css系列之关于字体的事
  • dva中组件的懒加载
  • flask接收请求并推入栈
  • interface和setter,getter
  • leetcode386. Lexicographical Numbers
  • miaov-React 最佳入门
  • node和express搭建代理服务器(源码)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • react-native 安卓真机环境搭建
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Vue--数据传输
  • 安卓应用性能调试和优化经验分享
  • 大数据与云计算学习:数据分析(二)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 王永庆:技术创新改变教育未来
  • 一个完整Java Web项目背后的密码
  • 正则与JS中的正则
  • ionic异常记录
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • !!Dom4j 学习笔记
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1)(1.9) MSP (version 4.2)
  • (C++20) consteval立即函数
  • (done) 两个矩阵 “相似” 是什么意思?
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (六)Hibernate的二级缓存
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .htaccess 强制https 单独排除某个目录
  • .Net mvc总结
  • .Net 代码性能 - (1)
  • .Net 路由处理厉害了
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)