背景

今天业务代码在写完成后,自测中发现空指针异常,主要数据库我刚从MySql 转为ob(oceanbase) 所以有点担心,看了数据库insert 是没有问题的,jdbc链接也是没有问题的

排查思路

出现的可能原因

  1. mybatis-config.xml里面或者spring-datasource.xml 是否有问题
  2. mapper 和 ***Mapper.xml 出现问题了
  3. sql 的字段是否对应,数据类型是否对应
  4. 检查编码是否统一
  5. List All elements are null导致NullPointerException
  6. mapper 是否注入成功
  7. mybatis 是否提交事务

解决方案

先进行排查上面的问题,我这样主要遇到是6

我写了一个策略模式,实现类是通过new 出来的FollowOperationStrategyCalculatorContext实现了数据库的操作, @Autowired @Resource Mapper注解是不起作用的, 因为自己new出来的对象不是spring容器中的,无法使用注入,因此UserMapper对象当然为NULL啦。 所以要注入到容器里面,方法有多种,自己看着处理哦

JAVA mybatis insert null转空_mysql

其它的自己排查一下

  1. mybatis-config.xml里面或者spring-datasource.xml 是否有问题
  1. mapper 路径是否对
  2. *Mapper.xml 路径是否对 数据库链接是否正确
  1. mapper 和 ***Mapper.xml 出现问题了
  1. DO和数据库是否对应
  2. 最好自动生成,利用脚手架
  3. 打印sql
  1. sql 的字段是否对应,数据类型是否对应
  1. 加强检查
  1. 检查编码是否统一
  1. 加强检查
  1. List All elements are null导致NullPointerException
  1. 当List对象显示 All elements are null时,虽然输入为[null],但是list.size()=1。不管是list==null,list.isEmpty(),list.size()都无法判断list是否为空。可以在执行上面语句时,加上list.remove(null)
  2. 参数校验 拦截
  1. mapper 是否注入成功
  1. 是否new 出来的service
  2. 是否加上注解 @Autowired @Resource
  1. mybatis 是否提交事务
  1. 查看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一下,可能出现的原因,经常复盘