使用MyBatis从Oracle读取数据时遭遇Null Pointer Exception求助
嗨,针对你遇到的空指针异常,结合你给出的XML映射语句和接口代码,我整理了几个常见的排查方向和解决方案,你可以逐一检查:
1. 先确认Mapper接口方法和XML映射ID完全匹配
你得确保db.java里的方法名和XML中<select>标签的id完全一致,包括大小写哦(MyBatis的ID是区分大小写的,哪怕Oracle的表名是大写)。比如你的接口应该是这样的:
public interface DbMapper { // 和XML里的id一一对应 List<String> selectItemPartNumberWithEco(); List<String> selectItemPartNumberWithoutEco(); }
要是方法名和ID对不上,MyBatis找不到对应的查询语句,调用的时候很可能就会触发空指针(或者更明确的绑定异常,但有时候代理对象处理不好就会出现NPE)。
2. 检查接口返回值类型是否合理
你的XML里resultType="String",但如果这个查询可能返回多条数据,接口方法必须返回List<String>,不能是单个String。要是定义成单个String,查询返回多条会直接抛TooManyResultsException,返回零条的话会返回null,这时候你直接用这个返回值就会踩空指针的坑。
如果确实只需要单个结果,可以在SQL里加个限制:
<select id="selectItemPartNumberWithEco" resultType="String"> SELECT ITEM_PART_NUMBER from CIS_ITEM_AGILE_ECO_DATA_TBL WHERE ECO_NUMBER IS NOT NULL AND ROWNUM <= 1 <!-- Oracle的行限制写法 --> </select>
同时接口方法写成String selectItemPartNumberWithEco();,但调用的时候一定要记得判空!
3. 确认Mapper接口有没有被正确注入
如果你用的是Spring或者Spring Boot:
- 先看看Mapper接口上有没有加
@Mapper注解; - 或者有没有在启动类/配置类上加
@MapperScan("你的Mapper所在包路径"),让Spring能扫描到它; - 再检查注入Mapper的地方,比如用
@Autowired或者构造注入的时候,有没有确保Mapper实例不是null。要是注入失败,调用方法肯定会空指针。
4. 检查XML映射文件有没有被MyBatis加载
- 如果是用传统的MyBatis配置文件(比如
mybatis-config.xml),得确认里面注册了你的db.xml:
<mappers> <mapper resource="你的db.xml所在路径,比如mapper/db.xml"/> </mappers>
- 要是Spring Boot的话,看看
application.properties或者application.yml里有没有配置mybatis.mapper-locations指向你的XML文件,比如:
mybatis.mapper-locations=classpath:mapper/*.xml
要是XML没被加载,MyBatis找不到查询语句,调用的时候也会出问题。
5. 排查查询结果里的空值
虽然你加了ECO_NUMBER IS NOT NULL的条件,但ITEM_PART_NUMBER字段本身可能有null值哦。如果接口返回的是List<String>,列表里的元素可能存在null,后续代码遍历的时候没判空,也会触发空指针。这种情况可以在SQL里再加个过滤:
<select id="selectItemPartNumberWithEco" resultType="String"> SELECT ITEM_PART_NUMBER from CIS_ITEM_AGILE_ECO_DATA_TBL WHERE ECO_NUMBER IS NOT NULL AND ITEM_PART_NUMBER IS NOT NULL <!-- 过滤掉字段为空的记录 --> </select>
内容的提问来源于stack exchange,提问作者Mysti

