Mybatis selectOne查询空指针异常NullPointerException

Mybatis selectOne查询空指针异常NullPointerException

为什么selectOne会报空指针异常?又如何解决?

假设有如下方法:

	public User selectUserByUsername(String username){
		DBAccess dbAccess = new DBAccess();//DBAccess是用于获取sqlSession的类
		SqlSession sqlSession = null;
		try {
            User user = new User();
			sqlSession = dbAccess.getSqlSession();
			user =  sqlSession.selectOne("User.selectUserByUsername", username);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(sqlSession != null){
				sqlSession.close();
			}
		}
		return user;
	}

上述代码在进行查询的时候如果没有查询到任何值,那么selectOne会返回null,并把null赋值给user对象。这样赋值的时候是不会报错的也不会有任何异常,但是当一个对象为null的时候,是不可以调用其get方法的,会出现空指针异常:
20200516150506819
但是将null赋值给user对象的情况和不给user的任何属性set任何值的情况不一样:
20200516150347375
可以看到,当user对象被创建出来的时候并不是null的,因此调用其get方法时会根据属性类型返回其初始值。

因此,在使用Mybatis进行查询(即使是查询单条结果)的时候,更推荐将查询结果使用List封装,用selectList方法来进行查询,好处是可以直接使用List的isEmpty方法和size方法来进行判断,并且可以避免空指针异常的麻烦。

解决

	public List<User> selectUserByUsername(String username){
		List<User> userList = new ArrayList<User>();
		DBAccess dbAccess = new DBAccess();
		SqlSession sqlSession = null;
		try {
			sqlSession = dbAccess.getSqlSession();
			userList =  sqlSession.selectList("User.selectUserByUsername", username);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(sqlSession != null){
				sqlSession.close();
			}
		}
		return userList;
	}