前言:

当我们springboot整合mybatis时,可以驼峰映射并打印sql语句

在单数据源的情况下,直接在 application.yml 文件中增加如下配置即可实现驼峰映射以及sql日志的打印:

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

问题

但是当我们配置多数据源时,使用yml全局配置的mybatis失效了

也就是说驼峰映射和sql日志失效不起作用,控制台打印信息大致为:

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5891281c] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@644157253 wrapping com.mysql.cj.jdbc.ConnectionImpl@44a6c6fb] will not be managed by Spring
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5891281c]

原因:

网上查了一下大致是因为(mybatis.configuration.log-impl)tk.mybatis 当SqlSessionFactory不存在定义的时候定义SqlSessionFactory;而我们配置多数据源时,重新定义了SqlSessionFactory;因此,如果要打印sql 语句的话,需在我们配置多数据源的SqlSessionFactory时添加MybatisProperties;

网上找了很多博客,大多都是手动注入配置类mybatis.configuration ,但是都没解决掉

	@Bean
	@ConfigurationProperties(prefix = "mybatis.configuration")
	public org.apache.ibatis.session.Configuration mybatisConfig(){
		return  new org.apache.ibatis.session.Configuration();
    }

解决方案:

直接在在重建SqlSessionFactory里加入如下代码:

 //开启驼峰
 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
 configuration.setMapUnderscoreToCamelCase(true);
 //开启log日志
 configuration.setLogImpl(StdOutImpl.class);
 sessionFactoryBean.setConfiguration(configuration);

完整代码如下:

    @Bean(name = "mysql1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("mysql1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:com/ceinet/anjian/mapper/mysql1/*.xml"));
        //开启驼峰
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        //开启log日志
        configuration.setLogImpl(StdOutImpl.class);
        sessionFactoryBean.setConfiguration(configuration);
        return sessionFactoryBean.getObject();
    }

附上多数据源整个config文件,可参考:

package com.ceinet.anjian.configure;

import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.ceinet.anjian.mapper.mysql1",sqlSessionFactoryRef = "mysql1SqlSessionFactory")
public class Mysql1DataSourceConfig {
    @Primary
    @Bean(name = "mysql1DataSource")
    @ConfigurationProperties("spring.datasource.mysql1")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysql1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("mysql1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:com/ceinet/anjian/mapper/mysql1/*.xml"));
        //开启驼峰
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        //开启log日志
        configuration.setLogImpl(StdOutImpl.class);
        sessionFactoryBean.setConfiguration(configuration);
        return sessionFactoryBean.getObject();
    }

}

更多推荐