一键解决关于springboot+mybatis 配置多数据源打印sql语句、以及设置驼峰映射后失效问题
·
前言:
当我们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();
}
}
更多推荐


所有评论(0)