JAVA批处理框架easybatch封装处理数据库和CSV文件。

Easybatch是一个利用JAVA编写的处理处理批量过程的开发框架。可以在github下载:

https://github.com/j-easy/easy-batch

Easybatch可以实现管道形式处理数据表和大文件,默认每次只提取100行数据到内存,等处理完,再提取下一批,这样可以节约内存空间,避免程序运行过程中的out of Memory错误。

在我们的magicube框架中,对于这个优秀的开源框架,进行了底层封装,以方便大家使用。开发工具,推荐使用netbean.8.2

对于数据库的封装如下:

   /**
     * 对数据库表数据进行批量处理
     *
     * @param fromDS 源数据库
     * @param query 源数据库表的查询语句,例:select deptid, setid, descr, smg_oa_deptid from
     * sysadm.PS_SMG_DEPT_SY_VW
     * @param setfields
     * 从源数据库取出的数据要映射为对象,需要调用setXxx(),这些字段名必须与query中的字段顺序保持一致,例如:"deptid",
     * "setid", "descr", "smgOaDeptid","xxx1"
     * 某些情况下源数据库表字段类型和CSV字段类型不一致,需要转换,比如字段xxx,这时需要在recordClass中增加setXxx1()函数,
     * 在setXxx1()函数中调用setXxx()进行数据转换,对应的setfields中要有xxx1字段;而getfields中字段不变,还是xxx,这样会调用getXxx()函数得到相应的数据
     * @param getfields
     * 对象要映射到目的源中的数据或者在processor中进行数据处理时,需要调用getXxx(),例如:"deptid", "setid",
     * "descr", "smgOaDeptid" ,"xxx"
     * @param recordClass model类class 要映射的对象,注意:
     * setfields和getfileds中的字段名字与recordClass中的字段名字保持一致(有时候model类中的字段名与数据库表的字段名不一致,比如:fields中的smgOaDeptid和insertSQL中的smg_oa_deptid)
     * @param recordProcessor
     * 对数据进行业务逻辑处理的实例,该实例必须实现org.easybatch.core.processor.RecordProcessor接口,如果是null,则不处理数据
     * @return
     *
     */
    public static JobReport processTableData(DataSource fromDS, String query, String[] setfields, String[] getfields, Class recordClass, RecordProcessor recordProcessor) {

        log.info("query:" + query);
        log.info("setfields:" + Arrays.toString(setfields));
        log.info("getfields:" + Arrays.toString(getfields));
        log.info("recordClass:" + recordClass.getName());

        //检查对数据进行业务逻辑处理的实例是否存在
        Job job;
        if (!ObjectUtils.isEmpty(recordProcessor)) {
            log.info("recordProcessor:" + recordProcessor.toString());
            job = aNewJob()
                    .reader(new JdbcRecordReader(fromDS, query))
                    .mapper(new JdbcRecordMapper<>(recordClass, setfields))
                    .processor(recordProcessor)
                    .build();

            //Execute the job
            JobExecutor jobExecutor = new JobExecutor();
            JobReport jobReport = jobExecutor.execute(job);
            jobExecutor.shutdown();

            return jobReport;
        } else {
            log.error("recordProcessor can't be null!");
            return null;
        }

    }

数据库返回结果,保存到数据保存字段类HrPushEmpl,需要定义,后面会用到。

package com.magicube.operplatform.hr.dao.model;

import java.io.Serializable;
import java.util.Date;

public class HrPushEmpl implements Serializable {

   
   

    /**
     * 编号
     *
     * @mbg.generated
     */
    private Integer id;

    /**
     * 员工ID
     *
     * @mbg.generated
     */
    private String emplid;

    /**
     * 员工主兼岗
     *
     * 员工主兼岗,0为主岗,其他为兼岗
     *
     * @mbg.generated
     */
    private Integer emplRcd;

    /**
     * 员工姓名
     *
     * @mbg.generated
     */
    private String name;

    /**
     * 业务单位编号
     *
     * @mbg.generated
     */
    private String setid;

    /**
     * 部门ID
     *
     * @mbg.generated
     */
    private String deptid;

    /**
     * 部门描述
     *
     * @mbg.generated
     */
    private String deptDescr;

    /**
     * 映射OA组织编码
     *
     * @mbg.generated
     */
    private String smgOaDeptid;

    /**
     * 人事状态
     *
     * 状态: - 1 代表在职 - 2 代表离职 - 3 代表退休 - 4 代表返聘
     *
     * 类型为(10)为1, 类型为(20)为2, 类型为(30)为1, 类型为(40)为2, 类型为(50)为3,
     *
     * 转换规则: 根据HR系统中的人事活动和人事状态转换为OA标准
     *
     *
     * @mbg.generated
     */
    private String smgRszt;

    /**
     * 用工性质 ASS--外单位离岗/协保 BOR--借用 CST--顾问 CTR--签约人员 ENP--企业 INS--事业 INT--实习生
     * IST--讲师 LDP--劳务派遣 OTH--其他 PAR--兼职 PHD--博士后 RET--退休返聘 UNF--非全日制
     *
     * @mbg.generated
     */
    private String emplClass;

    /**
     * 性别 0代表男 1代表女
     *
     * 类型为(F)为1, 类型为(M)为0, 类型为(U)为2,
     *
     * 转换规则: 根据HR系统标准信息接口的性别字段,将F转换为1,将M转换为0, 将U转换为2
     *
     * @mbg.generated
     */
    private String sex;

    /**
     * 手机号
     *
     * @mbg.generated
     */
    private String phone;

    /**
     * 手机号码
     *
     * @mbg.generated
     */
    private String mobilePhone;

    /**
     * 政治
     *
     * @mbg.generated
     */
    private String smgZhengzhi;

    /**
     * 民族
     *
     * @mbg.generated
     */
    private String smgMinzu;

    /**
     * 籍贯
     *
     * @mbg.generated
     */
    private String nativePlaceChn;

    /**
     * 邮箱
     *
     * @mbg.generated
     */
    private String emailAddr;

    /**
     * 生日
     *
     * @mbg.generated
     */
    private Date birthdate;

    /**
     * 学历
     *
     * @mbg.generated
     */
    private String smgXueli;

    /**
     * 工作时间
     *
     * @mbg.generated
     */
    private Date startDt;

    /**
     * 入职时间
     *
     * @mbg.generated
     */
    private Date smgStartDtUnit;

    /**
     * 岗位
     *
     * @mbg.generated
     */
    private String posnDescr;

    /**
     * 工作地点
     *
     * @mbg.generated
     */
    private String address1;

    /**
     * 电话1
     *
     * @mbg.generated
     */
    private String phone1;

    /**
     * 座机短号
     *
     * @mbg.generated
     */
    private String extension;

    /**
     * 直线领导
     *
     * @mbg.generated
     */
    private String supervisorId;

    /**
     * 证件类型 10--居民身份证 15--15位居民身份证 20--外国身份证 30--香港居民身份证 40--澳门居民身份证 50--台湾身份证
     * 60--其他证件
     *
     * @mbg.generated
     */
    private String nationalIdType;

    /**
     * 身份证号
     *
     * @mbg.generated
     */
    private String nationalId;

    /**
     * 是否是部门负责人
     *
     * 0为否,1为是
     *
     * @mbg.generated
     */
    private String smgYesNo;

    /**
     * 最后更新时间
     *
     * @mbg.generated
     */
    private Long lastupddttm;

    

    /**
     * 生效日期
     *
     * @mbg.generated
     */
    private Long effdt;

    /**
     * 是否推送
     *
     * 0 -- 不推送 1 -- 推送
     *
     * @mbg.generated
     */
    private Byte ispush;

    /**
     * 推送状态
     *
     * 0--未推送 1--推送成功 2--推送失败
     *
     * @mbg.generated
     */
    private Byte pushStatus;

    /**
     * 返回码 100000001--成功 100000002--失败 100000003--用户已存在 100000004--未知错误
     * 100000005-用户不存在
     *
     * @mbg.generated
     */
    private String rtncode;

    /**
     * 推送时间
     *
     * @mbg.generated
     */
    private Long pushtime;

    

    private static final long serialVersionUID = 1L;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmplid() {
        return emplid;
    }

    public void setEmplid(String emplid) {
 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Qt操作SQLite数据库封装类,可以实现将CSV文件导入到SQLite数据库中: ```cpp #include <QtSql> #include <QFile> class SqliteHelper { public: SqliteHelper(const QString& dbName) { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(dbName); } bool open() { if (!db.open()) { return false; } return true; } bool execute(const QString& sql) { QSqlQuery query(db); if (!query.exec(sql)) { return false; } return true; } bool importCsv(const QString& tableName, const QString& csvFilePath) { QFile file(csvFilePath); if (!file.open(QIODevice::ReadOnly)) { return false; } QTextStream in(&file); QStringList fields; QString line = in.readLine(); fields = line.split(","); QString createSql = "CREATE TABLE " + tableName + " ("; for (int i = 0; i < fields.count(); i++) { createSql += fields.at(i) + " TEXT"; if (i != fields.count() - 1) { createSql += ","; } } createSql += ")"; if (!execute(createSql)) { return false; } QSqlQuery query(db); QString insertSql = "INSERT INTO " + tableName + " ("; for (int i = 0; i < fields.count(); i++) { insertSql += fields.at(i); if (i != fields.count() - 1) { insertSql += ","; } } insertSql += ") VALUES ("; for (int i = 0; i < fields.count(); i++) { insertSql += "?"; if (i != fields.count() - 1) { insertSql += ","; } } insertSql += ")"; while (!in.atEnd()) { line = in.readLine(); QStringList values = line.split(","); query.prepare(insertSql); for (int i = 0; i < values.count(); i++) { query.addBindValue(values.at(i)); } if (!query.exec()) { return false; } } return true; } private: QSqlDatabase db; }; ``` 使用该类的示例代码如下: ```cpp SqliteHelper helper("test.db"); if (helper.open()) { if (helper.importCsv("my_table", "my_data.csv")) { qDebug() << "Import success!"; } else { qDebug() << "Import failed!"; } } else { qDebug() << "Open database failed!"; } ``` 其中,`test.db` 是数据库文件名,`my_table` 是将要创建的表名,`my_data.csv` 是CSV文件路径。 需要注意的是,上述代码中的CSV文件必须满足以下条件: - 文件第一行为表格字段名; - 文件中每行数据使用逗号分隔; - 文件编码为UTF-8。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值