insert method
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;
}
}