在 SpringBoot 项目中,使用 Mybatis 从数据库中查询数据,没有查到数据时报错空指针异常 而不是返回null类型对象怎么解决
时间: 2024-10-12 21:08:35 浏览: 68
在Spring Boot项目中,如果使用Mybatis从数据库查询数据时,遇到空指针异常通常是由于查询结果为null,而在后续处理中尝试访问null对象的属性或方法引起的。要解决这个问题,你可以采取以下几个步骤:
1. **设置合理的数据检查**:在调用Mybatis查询结果之前,添加适当的条件判断,确认查询是否返回了结果。例如,使用`Objects.nonNull()`检查resultList是否为空。
```java
List<User> users = sqlSession.selectList("select * from user");
if (Objects.nonNull(users) && !users.isEmpty()) {
// 进行后续操作
} else {
System.out.println("No data found.");
}
```
2. **使用Optional类**:Spring提供的`Optional`类可以帮助管理可能存在空值的结果。查询后将结果封装到`Optional`里,再进行下一步操作。
```java
Optional<User> optionalUser = sqlSession.selectOne("select * from user where id = :id", Map.of("id", someId));
optionalUser.ifPresent(user -> { /* process the user */ });
```
3. **设置默认值或异常处理**:在无法确定结果的情况下,可以设置一个默认值,或者在抛出异常前捕获并处理这个错误。
```java
User user = sqlSession.selectOne("select * from user where id = :id", Map.of("id", someId));
return user != null ? user : new User(); // 创建一个默认的用户对象
```
4. **配置Mybatis全局结果映射**:如果希望查询结果总是非空,可以在Mybatis的全局结果映射中设定,让所有查询结果都转换为非空对象。
```xml
<select id="selectUser" resultType="com.example.User">
select * from user where id = #{id}
</select>
```
然后在User类上加上`@Results`注解,强制转换为NonEmptyResultMap:
```java
@Mapper
public interface UserRepository {
@Select("select * from user")
@Results({
@Result(property = "user", column = "*", javaType = User.class, allowNull = false)
})
List<User> getUsers();
}
```
阅读全文