按照mybatics官网上来说,打印sql有两种办法。
方法一:在mybatis-config.xml中配置加一个setting
<?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="LOG4J"/>
...
</settings>
</configuration>
如果是spring集成mybatis的话,在sqlSessionFactory配置好configLocation属性
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/jstudio/user/dao/*.xml"></property>
</bean>
方法二:(#位置请自行替换)
1)首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句
log4j.rootLogger=INFO,stdout
log4j.logger.com.#.dao=TRACE
#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
2)mybatics的sqlsession信息配置
package com.#.app;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.logging.log4j.Log4jImpl;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@Configuration
@ComponentScan("com.#")
@MapperScan("com.#.dao")
public class AppConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(getDataSource());
return sqlSessionFactoryBean;
}
@Bean
public DataSource getDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setUsername("#");
driverManagerDataSource.setPassword("#");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/#?useUnicode=true&useSSL=true");
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
return driverManagerDataSource;
}
}
3)之后在main方法中执行
AnnotationConfigApplicationContext aa = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(aa.getBean(CityService.class).query());
发现还是无法打印。怎么解决呢?在前面加上
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
即:
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
AnnotationConfigApplicationContext aa = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(aa.getBean(CityService.class).query());
这样sql就可以打印在控制台上了。
但是如果不想在调用之前加呢?那我们也可以在sqlSessionFactoryBean()上进行变动,加上
//sql打印
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setLogImpl(Log4jImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
即:
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//sql打印
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setLogImpl(Log4jImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setDataSource(getDataSource());
return sqlSessionFactoryBean;
}
这样方法调用之前即使不加org.apache.ibatis.logging.LogFactory.useLog4JLogging();也是可以实现sql打印了,最终的效果是一样的。