You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JdbcTemplate与BeanPropertyRowMapper布尔值映射异常求助

解决JdbcTemplate中MySQL TINYINT(4)到boolean属性的映射问题

这个问题我之前也踩过坑,核心原因是MySQL的TINYINT(4)在JDBC默认映射逻辑里会被识别为Integer类型,而你的实体类用的是boolean属性,直接自动映射会因为类型不匹配失败。下面给你几个实用的解决方案:

方案1:自定义RowMapper手动转换(最直接可控)

findUserByUserName方法里,放弃自动映射,用自定义RowMapper手动处理类型转换逻辑:

public UserBean findUserByUserName(String userName) {
    String sql = "SELECT * FROM User WHERE userName = ?";
    return jdbcTemplate.queryForObject(sql, new Object[]{userName}, (rs, rowNum) -> {
        UserBean user = new UserBean();
        // 映射其他字段...
        // 手动把TINYINT(4)的1/0转成boolean
        user.setApproved(rs.getInt("isApproved") == 1);
        return user;
    });
}

这种方式完全由你掌控转换规则,不会有歧义,适合快速解决当前问题。

方案2:修改数据库字段类型为TINYINT(1)

如果数据库结构允许调整,把isApproved字段改成TINYINT(1)。MySQL的JDBC驱动会自动将TINYINT(1)的1映射为true、0映射为false,这样JdbcTemplate的自动映射(比如用BeanPropertyRowMapper)就能正常工作:

public UserBean findUserByUserName(String userName) {
    String sql = "SELECT * FROM User WHERE userName = ?";
    return jdbcTemplate.queryForObject(sql, new Object[]{userName}, 
        new BeanPropertyRowMapper<>(UserBean.class));
}

这个方案一劳永逸,也符合MySQL中存储布尔值的最佳实践。

方案3:自定义全局类型转换器

如果不想修改数据库,也不想每个查询都手动写转换逻辑,可以注册一个全局类型转换器,让Spring帮你自动完成Integer到boolean的转换:

  1. 先创建转换器类:
import org.springframework.core.convert.converter.Converter;

public class IntegerToBooleanConverter implements Converter<Integer, Boolean> {
    @Override
    public Boolean convert(Integer source) {
        return source != null && source == 1;
    }
}
  1. 把转换器注册到Spring的转换服务中:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.DefaultConversionService;

@Configuration
public class ConversionConfig {
    @Bean
    public DefaultConversionService conversionService() {
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new IntegerToBooleanConverter());
        return conversionService;
    }
}

之后BeanPropertyRowMapper就会自动使用这个转换器处理类型映射了。

额外说明

你的实体类getter/setter命名是符合JavaBean规范的:isApproved()对应boolean属性,setApproved()是正确的setter命名,所以属性名匹配这块没有问题,不用调整。

内容的提问来源于stack exchange,提问作者mmaceachran

火山引擎 最新活动