背景
今天业务代码在写完成后,自测中发现空指针异常,主要数据库我刚从MySql 转为ob(oceanbase) 所以有点担心,看了数据库insert 是没有问题的,jdbc链接也是没有问题的
排查思路
出现的可能原因
- mybatis-config.xml里面或者spring-datasource.xml 是否有问题
- mapper 和 ***Mapper.xml 出现问题了
- sql 的字段是否对应,数据类型是否对应
- 检查编码是否统一
- List All elements are null导致NullPointerException
- mapper 是否注入成功
- mybatis 是否提交事务
解决方案
先进行排查上面的问题,我这样主要遇到是6
我写了一个策略模式,实现类是通过new 出来的FollowOperationStrategyCalculatorContext实现了数据库的操作, @Autowired @Resource Mapper注解是不起作用的, 因为自己new出来的对象不是spring容器中的,无法使用注入,因此UserMapper对象当然为NULL啦。 所以要注入到容器里面,方法有多种,自己看着处理哦
其它的自己排查一下
- mybatis-config.xml里面或者spring-datasource.xml 是否有问题
- mapper 路径是否对
- *Mapper.xml 路径是否对 数据库链接是否正确
- mapper 和 ***Mapper.xml 出现问题了
- DO和数据库是否对应
- 最好自动生成,利用脚手架
- 打印sql
- sql 的字段是否对应,数据类型是否对应
- 加强检查
- 检查编码是否统一
- 加强检查
- List All elements are null导致NullPointerException
- 当List对象显示 All elements are null时,虽然输入为[null],但是list.size()=1。不管是list==null,list.isEmpty(),list.size()都无法判断list是否为空。可以在执行上面语句时,加上list.remove(null)
- 参数校验 拦截
- mapper 是否注入成功
- 是否new 出来的service
- 是否加上注解 @Autowired @Resource
- mybatis 是否提交事务
- 查看MybatisUtils是否提交
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mabatis第一步:获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//有了SqlsessionFactory,我们就可以从中获得SqlSession的实例了。
public static SqlSession getSqlSession(){
// 重点关注这里 boolean值
return sqlSessionFactory.openSession(true);
//如果不设置参数或者参数为false就是手动提交事务,
// 参数设置为true就是自动提交事务
}
}
经验
写代码还是细腻一些,多思考 多看看源码,反向思考原因
主要着急,大脑里面debug一下,可能出现的原因,经常复盘