基本类型会报错是因为Java值类型不能接收null,MyBatis映射时触发自动拆箱导致NullPointerException;应改用Integer、Long、Boolean等包装类,并在业务中判空处理。

MyBatis 查询结果为 null 时,若映射到 Java 基本类型(如 int、long、boolean),会抛出 NullPointerException 或类型转换异常,因为基本类型不能接收 null 值。解决方式是将实体类中对应字段改为包装类(如 Integer、Long、Boolean)。
为什么基本类型会报错?
Java 基本类型(int、boolean 等)是值类型,必须有确定的值;而数据库字段允许为 NULL,MyBatis 在映射时尝试把 null 赋给 int,会触发自动拆箱(Integer → int),导致 NullPointerException。
改成包装类的具体操作
- 将实体类中字段从
int age改为Integer age - 同理:
long id→Long id,boolean valid→Boolean valid - getter/setter 方法也需同步更新为包装类类型(IDE 通常可自动重生成)
- XML 映射文件或注解中无需修改,MyBatis 默认支持
null到包装类的映射
额外建议:避免空指针风险
- 使用包装类后,在业务逻辑中注意判空,例如:
if (user.getAge() != null && user.getAge() > 18) - 如需默认值,可用
Objects.requireNonNullElse(user.getAge(), 0)或三元表达式 - 数据库设计阶段,对非空字段加
NOT NULL约束,并配合default值,可减少null场景
特殊情况:@Param 传参或方法返回值
如果 Mapper 接口方法返回基本类型(如 int count()),而查询结果可能为 null(比如聚合函数无匹配行时),应改为返回包装类:Integer count()。MyBatis 能正确映射 NULL 为 null,调用方需自行处理空值。


















