使用 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
只要加这个配置就能解决问题了。