数据操作
前面已经介绍了基础的插入更新删除操作,为了解决插入/更新需要转换实体类的痛点,huiche提供了insertWith,updateWith等方法,可以直接插入/更新VO/Request对象
说明
相同的属性需要类型匹配,更新时也可通过传入Consumer参数,自行调整Update语句,比如单独设置部分列的值
Req对象直接写入/更新
添加一个Req类
java
public record ArtistReq(String name){}可自行在Req对象上添加校验等注解,此处仅为演示功能
使用insertWith或updateWith进行插入/更新
java
@Autowired
private ArtistDao dao;
public void helloworld(ArtistReq req) {
// 直接插入ArtistReq到Artist表
dao.insertWith(req);
// 直接更新Artist表的ID=2的记录,为req对象提供的属性
dao.updateByIdWith(req,2L);
}插入数据
插入时使用VO/Req对象的限制
即调用insertWith或insertBatchWith时
- 不会进行数据回填到java对象,包括来自数据库的自增值,也包括
@FillOnInsert的值回填,但是不会影响实际数据库层面的值生成/和@FillOnInsert填充到数据库 - 相比实体类
多余的属性会被忽略,即便值不是null - 相比实体类缺少的属性,如果实体类对应属性存在
@FillOnInsert依然会插入数据到数据库中,如果实体类不存在数据填充,且数据库中对应字段为NOT NULL 则会报错 - 不会读取标注在VO/Req对象属性上的
@FillOnInsert,仅实体类标注的有效
| 方法 | 说明 |
|---|---|
| insert | 实体类插入数据,如果实体类是普通java类,会回填自增属性到实体类对象中 |
| insertWith | 将其他的VO/Req等类,插入到实体类对应表中, 按属性名匹配 |
| insertWithMap | 将Map的数据,插入到实体类对应表中,按属性名与Map的key匹配 |
| insertBatch | 批量插入数据,使用单行多值插入语句,默认batchSize=500,可调整,不进行自增主键回填 |
| insertBatchWith | 批量将其他的VO/Req等类,插入到实体类对应表中, 按属性名匹配 |
删除数据
| 方法 | 说明 |
|---|---|
| delete | 按条件删除数据,需要传入条件,默认拦截无条件删除 |
| deleteById | 通过ID删除数据 |
| deleteByIds | 通过多个ID批量删除数据 |
| deleteSearch | 通过筛选对象删除数据 |
关于XXXById/ByIds方法
- 需要可以从实体类中读取到唯一主键(有主键,非联合主键),需要使用
@Column(primaryKey=true),作为主键,或者使用id作为列名,需其他列也不存在primaryKey - 如果一个实体类(表),标注了多个
parmaryKey=true的列, 即使用联合主键也不支持使用ById/ByIds - 同时适用于
delete系列,update系列,还有查询系列的 所有ById/ByIds结尾的所有方法 - 可参考@Column了解更多
更新数据
update系列方法规则
- 更新时,默认会忽略值为null的属性, 不会进行更新, 如果需要设置某一列为null,需要传入更新语句消费者
Customer<Update>操作,同时也可支持一些数据库侧运算更新操作 - 更新时,不会进行数据回填到java对象的操作,包括实体类,但不影响
@FillOnUpdate填充数据到数据库,只是不回填到java对象
更新时使用VO/Req对象的限制
即调用updateWith,updateByIdWith,updateByIdsWith,updateWithMap,updateByIdWithMap,updateByIdsWithMap等方法时
- VO/Req对象按属性名与实体类进行匹配,多余或缺失的属性都会被忽略,但如果实体类对应属性具有
@FillOnUpdate,依然会填充数据到数据库 - 不会读取标注在VO/Req对象属性上的
@FillOnUpdate,仅实体类标注的有效
| 方法 | 说明 |
|---|---|
| update | 通过条件更新数据,需要传入条件,实体类更新对象或更新语句消费者,默认拦截无条件更新 |
| updateById | 通过ID更新数据,需要传入实体类更新对象或更新语句消费者 |
| updateByIds | 通过多个ID批量更新数据 ,需要传入实体类更新对象或更新语句消费者 |
| updateWith | 通过条件更新数据,需要传入条件,VO/Req更新对象或更新语句消费者,默认拦截无条件更新 |
| updateByIdWith | 通过ID更新数据,需要传入VO/Req更新对象或更新语句消费者 |
| updateByIdsWith | 通过多个ID批量更新数据 ,需要VO/Req更新对象或更新语句消费者 |
| updateWithMap | 通过条件更新数据,需要传入条件,Map更新对象或更新语句消费者,默认拦截无条件更新 |
| updateByIdWithMap | 通过ID更新数据,需要传入Map更新对象或更新语句消费者,默认拦截无条件更新 |
| updateByIdsWithMap | 通过多个ID批量更新数据,需要传入Map更新对象或更新语句消费者,默认拦截无条件更新 |
java
public void helloworld() {
// 设置姓名为空
dao.update(update->update
.setNull(Artist::getName)
.where(Column.of(Artist::getId).eq(1L)));
// 设置版本+1
dao.update(update->
update.set(Artist::getVersion,Column.of(Artist::getVersion).plus(1))
.where(Column.of(Artist::getId).eq(1L)));
}