数据保存

教学视频

说明

对于填报数据很多情况下我们希望将修改或新增的数据保存起来,这样能够实现更大的便利性。目前支持多种保存方式:

  • 数据库保存

  • 自定义保存

数据库保存

填报数据数据库保存,我们需要制定对应数据源的数据表,并设置相关的字段映射关系。如下图:

image-20210512145156243

对于要提交的数据我们可以配置目标数据源的目标数据表。

对于每张要更新的表我们都需要定义对应的主键字段,并定义对应单元格的数据和字段数据的映射关系。

自定义保存

对应自定义保存的需求,Bask Report提供了com.basksoft.report.console.report.fill.custom.DataProcessor接口:

/**
 * 该接口类用于填报中的自定义填报里的处理类,使用时要实现该接口,并配置到services当中,
 * 需要注意的是,这些方法中提供的数据,受限于填报配置当中提交的数据类型。
 */
public interface DataProcessor<T> {

    /**
     * @param data 从中可获取不同状态数据
     * @param submitType 当前提交类型
     * @param name 当前提交项名称
     */
    void process(DataWrapper<T> data,SubmitType submitType,String name);

    /**
     * @return 返回当前处理类名称,一个ID标识
     */
    String name();
}

利用【SPI】,将这个类注册到JVM中.具体做法:

在项目的META-INF下添加services目录,下面添加一个文件,文件名为:com.basksoft.report.console.report.fill.custom.DataProcessor

然后将实现类配置进去,例如:

com.demo.processor.MyDataProcessor

注册好DataProcessor实现类后,提交数据逻辑通过这个name绑定一个数据处理对象的,设置效果如下:

image-20210512152616887

其中提供了process方法用于处理数据。

DataWrapper是一个数据封装类,通过它的三个方法可以获取到三种类型的集合数据:

    public List<T> getInsertData() {
        return insertData;
    }
    public List<T> getDeleteData() {
        return deleteData;
    }
    public List<T> getUpdateData() {
        return updateData;
    }

拿到这些数据,再做后续的数据逻辑处理。

SibmitType是一个枚举类型的数据,取值如下:

  • SubmitType.auto
  • SubmitType.delete
  • SubmitType.insert
  • SubmitType.clean
  • SubmitType.updateinsert

它们对应为填报配置中的数据提交方式:

image-20210512153609699

提交数据类型

如果采用自定义保存数据,DataWrapper中封装的数据类型可以通过”提交数据类型“指定:

image-20220809105855586

如果是自定义,则默认会将数据转换为HashMap封装到DataWrapper中,不过你也可以将数据类型调整为实体类:

image-20220809110006094

如上图,最终DataWrapper中封装的数据对象就是Employee对象。

其它

关于多数据源更新

如下图,当报表中拥有多个不同的数据区域,不同区域的数据我们希望更新到数据的不同表格中时,我们可以添加多个

image-20210512150634072

我们在配置的时候可以添加多个数据提交项:

image-20210512151506065

从而实现分片多数据源保存功能。

关于字段映射

关于字段映射设置,报表提供了智能助理功能,可以快速的设置字段映射,如下GIF展示了这种设置方法:

字段映射

关于数据提交方式

数据提交支持不同类型的数据提交方式:

  • 自动提交: 系统自动收集在页面中产生的新增、删除、修改三种类型数据,并提交到服务端,未变化的数据不会被提交。如果采用SQL类型,则需要设置主键,否则将不会执行删除、修改操作。
  • 删除提交:系统将页面中可见数据,即未被删除的数据提交到服务端,如果是SQL类型,需要设置主键,系统会自动将提交上来的数据删除,也就是说如果页面中的数据被用户删除了,这些删除的数据反而会被保留下来,未被删除的数据提交后会被从数据库中删除。
  • 插入提交:系统将页面中可见数据,即未被删除的数据提交到服务端,如果当前采用的是SQL类型,那么系统会自动将这些数据全部插入到对应的数据库表中。
  • 更新插入提交:系统将页面中可见数据,即未被删除的数据提交到服务端,如果采用的是SQL类型,提交的数据中某条记录有主键且主键值不为空,那么系统将自动执行更新操作,反之系统将执行插入操作。
  • 清空提交:系统将页面中可见数据,即未被删除的数据提交到服务端,如果是SQL类型,则要求用户定义一条清空当前数据库表数据的SQL,如果不定义,默认则会清空表中所有数据,然后再把提交上来的数据插入到表中,如果定义的话,那就先执行用户定义的清空表数据的SQL,然后再把提交上来的数据插入到表中。

关于自增长类型字段的处理

从1.0.9版本开始,BaskReport的填报中支持自增长类型字段,对于自增长类型我们只需要在填报项配置窗口的字段列表中勾选其自增属性即可,如下图所示:

在使用自增长类型字段时,只能对数据类型字段进行设置,同时一条填报项只能有设置一个自增长字段,大于一个将不会生效。

SubmitAspect

对于多个数据提交项希望自定义保存数据的,BaskReport提供了一个SPI接口:com.basksoft.report.console.report.fill.submit.SubmitAspect 这是一个全局配置,如果配置了这个接口,则所有的填报保存的时候都会实例化这个类。

public interface SubmitAspect {
    void before(List<Map<String,Object>> list,Report report);//开始保存
    void completed();//保存完成
    void exception(Exception ex);//保存出现异常
}

利用该接口可实现一些全局处理,例如事务管理等等。内部执行代码大致为:

    SubmitAspect aspect=submitAspect.getClass().newInstance();
    aspect.before(list, report);
    try {
        doSubmit();//调用多个数据提交项完成数据提交
        aspect.completed();
    }catch(Exception ex) {
        aspect.exception(ex);
        throw ex;
    }

例如: 在before中启动事务,completed中提交事务,exception中回滚事务

results matching ""

    No results matching ""