Spring Boot + Mybatis数据库多数据源解决驼峰映射不生效问题
mybatis多数据源解决驼峰映射不生效问题
·
1、问题描述
做查询操作时,返回数据为NULL,导致当使用这条数据报空指针错误
2、说明
在数据库字段命名规范中,通常使用下划线“_”来连接两个单词,比如:user_id。但是在Java开发中,实体字段通常采用驼峰命名法,比如userId。如果不开启驼峰命名法,则映射到对象无法赋值
解决方法:
1、直接为结果集设定一个resultMap
<resultMap id="getUserIdMap" type="com.zjt.blog.entity.BlogCategory">
<id property="userId" column="user_id"/>
</resultMap>
<select id="getPolicyLocalProduct" resultMap="getUserIdMap">
select user_id from table;
</select>
2、配置文件加入以下配置
mybatis.configuration.mapUnderscoreToCamelCase=true
#或者
mybatis.configuration.map-underscore-to-camel-case=true
3、在多数据源配置中定义mybatis全局变量
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration globalConfiguration(){
return new org.apache.ibatis.session.Configuration();
}
@Bean(name = "firstSqlSessionFactory")
@Primary
public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); //配置驼峰命名
return bean.getObject();
}
4、上述方法可能不行,就用下面的,我就是下面的
@Configuration
@MapperScan(basePackages = "it.aspirin.riderserver.mapper.mysql", sqlSessionTemplateRef = "mySqlSessionTemplate")
public class MySQLDataSourceConfig {
/**
* 配置多数据源导致下划线命名映射为驼峰失效,需要在这里加一个配置,并在下面SqlSessionFactory方法中引入
*
* @return 配置
*/
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration globalConfiguration() {
return new org.apache.ibatis.session.Configuration();
}
/**
* 自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
*/
@Bean(name = "mysqlDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mySqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//这里将下划线映射为驼峰的配置引入
bean.setConfiguration(globalConfiguration());
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"));
return bean.getObject();
}
/**
* 创建事务
*
* @param dataSource
* @return
*/
@Bean(name = "mysqlTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 用于注入dao
*
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "mySqlSessionTemplate")
@Primary
public SqlSessionTemplate SqlSessionTemplate(@Qualifier("mySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "mysqlDataSource")
public JdbcTemplate mysqlJdbcTemplate(@Qualifier(value = "mysqlDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
更多推荐
已为社区贡献4条内容
所有评论(0)