多数据源控制台打印sql语句

736 阅读1分钟

前言

在日常开发中,我们需要在控制台打印sql语句,用于查找问题等。本文主要介绍使用springboot+mybatis-plus框架下,配置多数据源打印sql语句失效的问题。

1、单数据源

通过增加以下配置,即可在控制台打印日志:

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2、多数据源

2.1、问题

仍然添加了上述配置,控制台报错:

图片.png

2.2、解决办法

在每个数据源初始化的时候,往SqlSessionFactoryBean分别set一个MybatisConfiguration对象,MybatisConfiguration对象需要设置setLogImpl方法,方法的参数就是上述的配置value,即org.apache.ibatis.logging.stdout.StdOutImpl

比如:

@Configuration
@MapperScan(basePackages = "com.yskj.skywalking.dao.demo", sqlSessionFactoryRef = "demoSqlSessionFactory")
public class DemoDataSourceConfig {

    @Bean(name = "demoDataSource")
    @ConfigurationProperties(prefix = "spring.demo.datasource")
    public DruidDataSource demoDataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "demoSqlSessionFactory")
    public SqlSessionFactory demoSqlSessionFactory(@Qualifier("demoDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);
        bean.setConfiguration(mybatisConfiguration);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/demo/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean(name = "demoSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate demoSqlSessionTemplate(@Qualifier("demoSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

2.3、分析原因

我们配置多数据源时,重新定义了SqlSessionFactory,因此,如果要打印sql 语句的话,需在我们配置每个数据源的SqlSessionFactory时都要添加mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl配置,就像每个数据源都配置jdbc连接参数:用户名、密码、地址一样。