Mybatis学习系列(八):Insert,update,delete的执行

本文详细解析了Mybatis中Insert、update、delete操作的执行过程,包括通过MapperMethod获取MappedStatement,处理集合参数,执行executor的update方法,重点介绍了SimpleExecutor的执行步骤,如获取数据库连接、预编译Statement、设置参数信息,以及最终执行update方法。通过这些步骤,全面了解Mybatis的 CRUD 操作流程。
摘要由CSDN通过智能技术生成

由于MapperMethod中Insert,update,delete这三个的执行方式是一样的,我们统一看一下

case INSERT: {
      Object param = method.convertArgsToSqlCommandParam(args);
        result = rowCountResult(sqlSession.insert(command.getName(), param));
        break;
      }
      case UPDATE: {
        Object param = method.convertArgsToSqlCommandParam(args);
        result = rowCountResult(sqlSession.update(command.getName(), param));
        break;
      }
      case DELETE: {
        Object param = method.convertArgsToSqlCommandParam(args);
        result = rowCountResult(sqlSession.delete(command.getName(), param));
        break;
      }

这里都是两步,①执行sqlsession的对应方法②对执行结果进行处理

1.执行sqlsession的对应方法:最终都是走的update方法

public int insert(String statement) {
    return insert(statement, null);
  }

  @Override
  public int insert(String statement, Object parameter) {
    return update(statement, parameter);
  }

  @Override
  public int update(String statement) {
    return update(statement, null);
  }

  @Override
  public int delete(String statement) {
    return update(statement, null);
  }

  @Override
  public int delete(String statement, Object parameter) {
    return update(statement, parameter);
  }


  @Override
  public int update(String statement, Object parameter) {
    try {
      dirty = true;
      //1.根据ID获取MappedStatement
      MappedStatement ms = configuration.getMappedStatement(statement);
      //2.对集合参数进行处理
      //3.执行executor的update方法
      return executor.update(ms, wrapCollection(parameter));
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

1.1根据ID获取MappedStatement 对象:缓存中获取

public MappedStatement getMappedStatement(String id) {
    return this.getMappedStatement(id, true);
  }

  public MappedStatement getMappedStatement(String id, boolean validateIncompleteStatements) {
    if (validateIncompleteStatements) {
      buildAllStatements();
    }
    return mappedStatements.get(id);
  }

1.2对集合参数进行处理

private Object wrapCollection(final Object object) {
    //如果是集合类型的参数
    if (object instanceof Collection) {
      //参数以,map形式返回
      StrictMap<Object> map = new StrictMap<Object>();
      //设置参数名称为collection
      map.put("collection", object);
      //如果是list类型
      if (object instanceof List) {
        //设置参数名称为list
        map.put("list", object);
      }
      return map;
    } else if (object != null && object.getClass().isArray()) {
      //如果是数组类型,以map形式返回
      //设置参数名称为array
      StrictMap<Object> map = new StrictMap<Object>();
      map.put("array", object);
      return map;
    }
    //不是集合和数组类型  原样返回
    return object;
  }

1.3执行executor(B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值