Skip to main content

Insert

Hint

This article is generated by AI translation.

You can insert data using an entity bean or a Map as the container.

Use a bean as the data container
User user = new User();
user.setId(20);
user.setName("new name");
user.setAge(88);
user.setCreateTime(new Date());

LambdaTemplate lambda = ...;
int result = lambda.insert(User.class)
.applyEntity(user)
.executeSumResult();
// result is 1
Use a Map as the data container
Map<String, Object> user = new HashMap<>();
user.put("id", 20);
user.put("name", "new name");
user.put("age", 88);
user.put("create_time", new Date());

LambdaTemplate lambda = ...;
int result = lambda.insert(User.class)
.applyMap(user)
.executeSumResult();
// result is 1

Batching

Use batch insert when inserting many records.

User user1 = new User();
...
User user2 = new User();
...
User user3 = new User();
...

LambdaTemplate lambda = ...
int result = lambda.insert(User.class)
.applyEntity(user1, user2, user3); // 不定参方式
//.applyEntity(new User[]{user1, user2, user3}); // 使用数组
//.applyEntity(Arrays.asList(user1, user2, user3));// 使用 List
.executeSumResult();
// result is 3
  • For Map data, use applyMap instead of applyEntity.
  • You can call applyEntity/applyMap multiple times before executeSumResult to stage batches.

Write conflicts

Unintentionally inserting duplicates can cause primary-key conflicts. A common approach is “check then update/insert,” e.g.:

常规方法
if (adapter.queryByEntity(User.class)
.eq(User::getId,user.getId())
.queryForCount() > 0) {
// update
} else {
// insert
}

Databases often provide more efficient conflict handling, for example:

  • MySQL: ON DUPLICATE KEY UPDATE on INSERT.
  • Oracle: MERGE INTO ... WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ....

Using these dialect features requires:

  • dbVisitor dialect support; see dialect support.
  • Setting a conflict strategy via onDuplicateStrategy.

dbVisitor provides three conflict strategies to avoid extra code:

  • Into: plain INSERT INTO (throws on conflict).
  • Update: use dialect-specific MERGE/ON CONFLICT to update on conflict.
  • Ignore: use IGNORE or dialect-specific syntax to skip conflicting rows.

Default (INTO)

Uses plain insert into; conflicts error out.

默认策略可以不指定,也可以明确设置
LambdaTemplate lambda = ...
int result = lambda.insert(User.class)
.applyEntity(user);
.onDuplicateStrategy(DuplicateKeyStrategy.Into) // explicit
.executeSumResult();

Replace (UPDATE)

Implementation depends on dialect, for example:

  • MySQL: ON DUPLICATE KEY UPDATE clause on INSERT.
  • Oracle: MERGE INTO ... WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ....
  • PostgreSQL: ON CONFLICT (...) DO UPDATE SET ....
提示

Dialect determines availability; forcing it without support will raise errors.

使用方式
LambdaTemplate lambda = ...
int result = lambda.insert(User.class)
.applyEntity(user);
.onDuplicateStrategy(DuplicateKeyStrategy.Update) // update on conflict
.executeSumResult();

Ignore (IGNORE)

Implementation depends on dialect, for example:

  • MySQL: INSERT IGNORE.
  • Oracle: MERGE INTO ... WHEN NOT MATCHED THEN ....
  • DM: hint IGNORE_ROW_ON_DUPKEY_INDEX to ignore by PK.
使用方式
LambdaTemplate lambda = ...
int result = lambda.insert(User.class)
.applyEntity(user);
.onDuplicateStrategy(DuplicateKeyStrategy.Ignore) // ignore on conflict
.executeSumResult();