mybatis 打印SQL语句

本文介绍了两种在MyBatis中打印SQL语句的方法:一种是在mybatis-config.xml中配置,另一种是在Spring集成环境中调整log4j级别并修改sqlSessionFactoryBean。针对无法打印SQL的问题,提出了解决方案,即在LogFactory中使用Log4J日志,并提供了在sqlSessionFactoryBean中进行相应配置以避免每次调用前手动设置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照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打印了,最终的效果是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值