insert method

Future<int> insert(
  1. String statementId,
  2. Map<String, dynamic> params
)

Runs an <insert>.

statementId is namespace.id. params are the statement parameters. Returns the new rowid. With useGeneratedKeys or <selectKey> the key is also written back into params.

Implementation

Future<int> insert(
  String statementId,
  Map<String, dynamic> params,
) async {
  final statement = _getStatement(statementId);
  _validateStatementType(statementId, statement, SqlStatementType.insert);

  // <selectKey order="BEFORE"> : INSERT 전에 키를 미리 조회
  final selectKey = statement.selectKey;
  if (selectKey != null && selectKey.order == SelectKeyOrder.before) {
    params[selectKey.keyProperty] = await _executeSelectKey(statement, selectKey, params);
  }

  final stopwatch = Stopwatch()..start();
  final result = DynamicSqlBuilder.build(statement, Map<String, dynamic>.from(params));

  try {
    final id = await _withTimeout(
      _database.rawInsert(result.sql, result.parameters),
      statement,
    );
    stopwatch.stop();

    MybatisLogger.logSql(
      statementId: statementId,
      sql: result.sql,
      parameters: result.parameters,
      executionTime: stopwatch.elapsed,
      resultCount: 1,
    );

    // useGeneratedKeys="true" keyProperty="ID" : 생성된 rowid를 파라미터에 기록
    if (statement.writesGeneratedKey) {
      params[statement.keyProperty!] = id;
    }

    // <selectKey order="AFTER"> : INSERT 후에 키를 조회
    if (selectKey != null && selectKey.order == SelectKeyOrder.after) {
      params[selectKey.keyProperty] = await _executeSelectKey(statement, selectKey, params);
    }

    return id;
  } catch (e, stackTrace) {
    MybatisLogger.logError(
      statementId: statementId,
      sql: result.sql,
      error: e,
      stackTrace: stackTrace,
    );
    if (!MybatisConfig.suppressSqlErrors) rethrow;
    return -1;
  }
}