我正在研究ETL Java项目,它做了三件事 extract - 从表中读取数据 将数据转换为JSON 加载数据 它工作正常。问题是我正在为每个表做这件事。我现在的方式是
class ETLHelper
{
private Person read(ResultSet results){
Person p = new Person();
p.setPersonId(results.getString("PERSON_ID"));
p.setPersonName(results.getString("PERSON_NAME"));
return p;
}
private String transform(Person p){
TransformPerson t = new TransformPerson();
t.setTransformPersonId(p.getPersonId);
t.setTransformPersonName(p.getPersonName);
PersonEData eData = new PersonEData();
eData.setDate1(p.date1);
eData.setDate2(p.date2);
t.seteData(eData);
PersonDetails pd = new PersonDetails();
pd.settransformdata(t);
return writeValueAsString(pd);
}
public void etl(){
Connection c = null;
PreparedStatement p = null;
ResultSet r = null;
c = getConnection();
p = c.prepareStatement(getSql());
r = p.executeQuery();
while(r.next()){
messages.add(transform(read(r)));
/*code for loading data*/
}
}
}
Person.Java:
@JsonTypeName(value = "PERSON")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
public class Person{
@JsonProperty(value = "PERSON_ID")
private String personId;
//getter and setter for personId
@JsonProperty(value = "PERSON_NAME")
private String personName;
//getter and setter for personName
}
TransformPerson.java:
@JsonRootName(value = "Person")
class TransformPerson{
private String transformPersonName;
private String transformPersonId;
/*getter and setter for transformPersonName and tranformPersonId*/
@override
String toString(){
return "Person [name =" + transformPersonName + ", id = " + transformPeronId "]";
}
}
PersonEdata:
private String date1;
private String date2;
/*getter and setter*/
@override
public String toString(){
return "PersonEdata [date1=" + date1 +", date2=" + date2 + "]";
}
因此,为每个表编写了一个Person类,一个转换所需的类和etl类。还有一些额外的类,如PersonEdata,在调用toString()时返回JSON。无论如何,我是否可以更改此设计以避免为每个表编写类似的代码?有一些限制。每个表都是不同的,并且需要转换类,因为还有其他程序使用生成的JSON,因此我们需要生成需要这些程序理解的JSON。
答案 0 :(得分:0)
在您当前的解决方案中,您创建了:
人员类 - 保存从DB
PersonTransform类 - 将数据从Person复制到其他表示,并通过覆盖toString()
为了简单起见,您可以做的是:
为每个实体(表)提供类似Person的单个类 - 这是JSON Serializable。
不要覆盖toString
方法来表示JSON表示 - 而是使用JSON序列化程序。