Map 写入、更新和删除
Map 写入和变更操作由 MapInsert、MapUpdate、MapDelete 提供。映射 Map 模式和自由 Map 模式使用同一组 API,但字段解释规则不同。
适合场景
- 数据已经是
Map<String, Object>,需要直接写入或更新数据库。 - 需要批量导入、任务同步或动态字段写入。
- 需要在更新、删除时保留构造器 API 的条件能力和危险操作保护。
不适合场景
- 字段固定且希望使用编译期检查;应使用 Entity 模式。
- SQL 变更逻辑很复杂,需要多表更新、子查询或数据库专有语法;可使用 编程式 API 或 Mapper 文件。
- 只是按主键做实体 CRUD;优先看 BaseMapper。
操作模式
| 操作 | 映射 Map 模式 | 自由 Map 模式 |
|---|---|---|
| 写入 | lambda.insert(User.class).asMap() | lambda.insertFreedom("users") |
| 更新 | lambda.update(User.class).asMap() | lambda.updateFreedom("users") |
| 删除 | lambda.delete(User.class).asMap() | lambda.deleteFreedom("users") |
字段处理差异
映射 Map 模式
Map key -> 对象映射过滤和转换 -> 数据库列
自由 Map 模式
Map key -> 按列名处理 -> 数据库列
写入 Map
映射 Map 写入
Map<String, Object> data = new HashMap<>();
data.put("id", 1001);
data.put("loginName", "alice");
data.put("email", "alice@example.com");
int rows = lambda.insert(User.class)
.asMap()
.applyMap(data)
.executeSumResult();
自由 Map 写入
Map<String, Object> data = new HashMap<>();
data.put("id", 1001);
data.put("login_name", "alice");
data.put("email", "alice@example.com");
int rows = lambda.insertFreedom("users")
.applyMap(data)
.executeSumResult();
映射 Map 模式会根据对象映射过滤和转换字段;自由 Map 模式直接按调用方提供的列名生成 SQL。
更新 Map
映射模式下,updateToSample 只更新样本中非空且可更新的字段。自由模式会处理传入的 key,包括 null 值;需要跳过 null 时应先过滤 Map。
样本式更新
Map<String, Object> sample = new HashMap<>();
sample.put("loginName", "alice_new");
sample.put("email", null);
int rows = lambda.update(User.class)
.asMap()
.eq("id", 1001)
.updateToSample(sample)
.doUpdate();
updateRow 适合整行式更新。映射模式下,缺少的可更新属性会按 null 处理;自由模式只处理传入的 key。自由模式没有主键元数据,调用前需显式 allowUpdateKey(),并自行保证 Map 不包含不应修改的主键。
整行式更新
Map<String, Object> row = new HashMap<>();
row.put("login_name", "alice_new");
row.put("email", "alice_new@example.com");
int rows = lambda.updateFreedom("users")
.eq("id", 1001)
.allowUpdateKey()
.updateRow(row)
.doUpdate();