简体   繁体   English

避免重复代码Java

[英]avoid repetitive code Java

I am working on ETL Java project and it does 3 things extract - read the data from a table transform the data to JSON Load the data It works fine. 我正在ETL Java项目上工作,它提取了3件事-从表中读取数据将数据转换为JSON加载数据效果很好。 The issue is I am doing it for each table. 问题是我正在为每个表这样做。 The way I have right now is 我现在的方式是

   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: 人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: 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: PersonEdata:

private String date1;
private String date2;
/*getter and setter*/
@override
public String toString(){
 return "PersonEdata [date1=" + date1 +", date2=" + date2 + "]";
}

So a Person class, a class needed for transformation and etl class is written for each table. 因此,为每个表编写了Person类,转换所需的类和etl类。 There are also some additional classes like PersonEdata that returns JSON when toString() is called. 还有一些其他类,例如PersonEdata,当调用toString()时返回JSON。 Is there anyway can I change this design to avoid writing the similar code for each table? 无论如何,我可以更改此设计以避免为每个表编写类似的代码吗? There are some constraints. 有一些限制。 Each table is different and they transformation class is needed because there are other programs that uses the JSON generated so we need to generate JSON that needs to understood by those programs. 每个表都是不同的,并且它们需要转换类,因为还有其他程序使用生成的JSON,因此我们需要生成那些程序需要理解的JSON。

In your current solution, you have created : 在当前解决方案中,您已经创建了:

  1. Person class - to hold the data retrieved from DB 人员类-保存从数据库检索的数据

  2. PersonTransform class - to copy the data from Person to other representation and have extended the capability to create JSON by overrinding toString() PersonTransform类-将数据从Person复制到其他表示形式,并通过覆盖toString()扩展了创建JSON的功能

To keep it simple what you can do is: 为简单起见,您可以执行以下操作:

  1. Have single Class like Person for each entity (Table) - which is JSON Serializable. 每个实体(表)都有一个像Person这样的类-这是JSON可序列化的。

  2. Don't override the toString method to represent the JSON representation - use JSON serializer instead. 不要重写toString方法来表示JSON表示-请改用JSON序列化器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM