Skip to content

数据操作

前面已经介绍了基础的插入更新删除操作,为了解决插入/更新需要转换实体类的痛点,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对象的限制

即调用insertWithinsertBatchWith

  • 不会进行数据回填到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)));
}