MyBatis中selectOne方法抛出NullPointerException问题求助
排查
sqlSession是否为null
你的DAO方法直接调用sqlSession.selectOne,如果sqlSession未正确初始化或注入,必然抛出NPE。可以在方法中添加调试代码确认:public int reviewTotalCnt() { System.out.println("========== Review Total Count DAO =========="); // 新增调试代码 System.out.println("sqlSession is null? " + (sqlSession == null)); return sqlSession.selectOne("ReviewMapper.reviewTotalCnt"); }如果输出为
true,需检查sqlSession的初始化逻辑:比如是否通过Spring容器正确注入,或是手动创建时SqlSessionFactory是否成功获取到数据库连接。核对Mapper的namespace与调用路径
XML映射文件的根节点<mapper>必须设置正确的namespace,否则MyBatis无法匹配SQL语句。你的调用路径是ReviewMapper.reviewTotalCnt,XML中需对应:<mapper namespace="ReviewMapper"> <!-- 你的select语句 --> </mapper>若namespace使用了全限定类名(如
com.yourpackage.dao.ReviewMapper),则调用时必须写完整路径:sqlSession.selectOne("com.yourpackage.dao.ReviewMapper.reviewTotalCnt")。直接验证SQL语句有效性
将XML中的SQL复制到数据库客户端执行:SELECT COUNT(r_id) FROM b_review;确认是否能正常返回数值(哪怕是0)。若SQL本身存在错误(如表名拼写错误、字段不存在),可能导致MyBatis返回异常或null,进而引发问题。
确认映射文件已被MyBatis加载
检查MyBatis配置文件(如mybatis-config.xml)或Spring配置,确保该ReviewMapper的XML文件已被添加到映射器列表:<!-- mybatis-config.xml 示例 --> <mappers> <mapper resource="path/to/your/ReviewMapper.xml"/> </mappers>若映射文件未被加载,MyBatis找不到对应SQL语句,可能抛出绑定异常或返回null。
查看堆栈跟踪定位NPE具体位置
分析异常堆栈信息,确认NPE发生在sqlSession.selectOne调用时,还是结果赋值阶段:- 若发生在调用时:必然是
sqlSession为null; - 若发生在赋值阶段:可能是MyBatis返回了null,当用
int接收时拆箱失败(但你已改为Integer仍有问题,需进一步排查SQL执行是否异常)。
- 若发生在调用时:必然是
内容的提问来源于stack exchange,提问作者SectionPJY

