加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数据处理---Spring Batch之实践

发布时间:2021-02-25 18:22:58 所属栏目:大数据 来源:网络整理
导读:上面介绍了Spring Batch的基本概念和简单的demo项目,显然这些还是不够实际使用的。下面我们来更多的代码实践。 ? ? ? ? 在上面的基础项目上面,我们来更多的修改: ? ? ? ? 不用项目默认的hsql DB,用mysql,让ItemReader,ItemWriter 支持mysql; ? ? ? ? 支

@Entity
@Table(name = "customer")
public class CustomerCredit {
public static final String TABLE_NAME = "customer";

@Column(name = "name",nullable = true,length = 12)
private String name;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
private Integer id;

@Column(name = "credit",precision = 15,scale = 2)
private BigDecimal credit;

FlatFileItemReader 使用默认的DefaultLineMapper,里面指定了lineTokenizer和fieldSetMapper,就是说要怎么读一行行的数据,读了之后怎么和Bean的字段Mapper,这样后面的步骤好继续处理。

public class CustomerMapper implements FieldSetMapper<CustomerCredit> {
@Override
public CustomerCredit mapFieldSet(FieldSet fieldSet) throws BindException {
CustomerCredit lv = new CustomerCredit();
lv.setId(Integer.parseInt(fieldSet.readString(0)));
lv.setName(fieldSet.readString(1));
lv.setCredit(fieldSet.readBigDecimal(2));
return lv;
}
}

如果是读数据库呢?就是下面那个JdbcCursorItemReader,里面指定了dataSource,sql,rowMapper,这些都类似文件

public class CustomerCreditRowMapper implements RowMapper {
? ? public static final String ID_COLUMN = "id";
? ? public static final String NAME_COLUMN = "name";
? ? public static final String CREDIT_COLUMN = "credit";

? ? public Object mapRow(ResultSet rs,int rowNum) throws SQLException {
? ? ? ? CustomerCredit customerCredit = new CustomerCredit();
? ? ? ? customerCredit.setId(rs.getInt(ID_COLUMN));
? ? ? ? customerCredit.setName(rs.getString(NAME_COLUMN));
? ? ? ? customerCredit.setCredit(rs.getBigDecimal(CREDIT_COLUMN));
? ? ? ? return customerCredit;
? ? }
}

还可以和hibernate结合来读取数据,可以读取存储过程的数据,等等,具体可以参考spring batch文档

说好的自定义处理数据呢,比如我们把每个人的Credit加10.

@Component("customProcessor")
public class CustomProcessor implements
ItemProcessor<CustomerCredit,CustomerCredit> {
@PersistenceContext
private EntityManager em;
@Override
public CustomerCredit process(CustomerCredit item) throws Exception {
System.out.println(new Date().toString()+"start to process");
if (item == null) {
return null;
}
try {
item = em.find(CustomerCredit.class,item.getId());
item.setCredit(item.getCredit().add(new BigDecimal(10)));
//find by id才可以persist (否则出现detached entity passed to persist)
em.persist(item);
} catch (Exception e) {
e.printStackTrace();
}
return item;
}
}

每一步的处理,我们想看看结果,可以定制一个ItemReadListener

public class CustomStepListener implements ItemReadListener<CustomerCredit> ? 具体代码省略

修改module-context.xml

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读