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);
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐