2012-11-08 3 views
1

4gl에서 java로 동일한 기능을하는 몇 가지 문제점이 있습니다. 4gl 코드에 대한 간략한 설명이 있습니다. 먼저, AFPOPF1은 테이블이고 IO_AFPOPF1은 AFPOPF1의 내용을 저장하는 변수입니다. 'FETCH SCUR_1 INTO IO_AFPOPF1. *'문을 사용하여 WK_QUERY를 수행하고 행 결과를 IO_AFPOPF1. *에 저장하십시오. 'FETCH SCUR_1 INTO IO_AFPOPF1. *'을 실행 한 후 커서는 다음 행을 참조합니다. while 루프에서 IO_AFPOPF1.POLYN1을 포함하는 두 번째 쿼리를 수행 중입니다.jdbc resultSet을 사용자 정의 클래스에 일반적으로 매핑하는 방법은 무엇입니까?

DEFINE IO_AFPOPF1 RECORD LIKE AFPOPF1.* 
    . 
    . 
    . 
WK_QUERY = "SELECT * FROM AFPOPF1 WHERE PRTDAT='IO_FONLY.PRTDAT' 
     " AND((FCERNO[2] = 'C' AND LENGTH(FCERNO) = 9)" 
     " OR (FCERNO[3] = 'C' AND LENGTH(FCERNO) = 10))" 
     " AND SOLIN1 LIKE '", BS_SOLIN1,"'" 
     " ORDER BY POLYN1,FCERNO"  
    . 
    . 
    . 
PREPARE SSTM_1 FROM WK_QUERY 
DECLARE SCUR_1 SCROLL CURSOR 
FETCH SCUR_1 INTO IO_AFPOPF1.* 

WHILE STATUS = 0 
    SELECT DEPTWN INTO WK_DEPTWN FROM COMLIB:DEPTPF1 
    WHERE DEPTNO = IO_AFPOPF1.POLYN1 
    . 
    . 
    . 
    IF WK_DEPTWN != IO_FONLY.DEPTWN 
     FETCH SCUR_1 INTO IO_AFPOPF1.* 
     CONTINUE WHILE 
    ELSE 
     LET SW_COUNT = SW_COUNT+1 
    END IF 
    . 
    . 
    . 
    FETCH SCUR_1 INTO IO_AFPOPF1.* 
END WHILE 

자바 :

//the class mapping to Afpopf1 Table 
public class TableAfpopf1 { 
    private String fcerno;//var1 
    private String polyn1;//var2 
     . 
     . 
     . 
    private Date chkdat;//var58 

    public void setXXX 
     . 
     . 
     . 
} 

//database connection anf return resultSet 
public class DBConnection { 
    private Connection connection; 
    private Statement statement; 
    private PreparedStatement preS; 
    private ResultSet resultSet; 
    private boolean hasRow; 
    private boolean isReturn; 
    private String dbURL; 
    private ArrayList<ArrayList<Object>> allResultList; 
    private Object returnObj; 

    public DBConnection() { 
     this.connection = null; 
     this.statement = null; 
     this.preS = null; 
     this.resultSet = null; 
     this.hasRow = false; 
     this.isReturn = false; 
     this.dbURL = "";   
     this.allResultList = new ArrayList<ArrayList<Object>>(); 
    } 

public void connectDB(String query) { 
    try {    
     statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 

     if (query.contains("SELECT")) 
      resultSet = statement.executeQuery(query); 

     ResultSetMetaData metaData = resultSet.getMetaData(); 
     int numberOfColumns = metaData.getColumnCount(); 

     while (resultSet.next()) { 
      hasRow = true; 
      if (isReturn) {     
       if (numberOfColumns == 1) { 
        resultSet.last(); 
        int rowCount = resultSet.getRow(); 
        resultSet.first(); 

        if (rowCount == 1)       
         returnObj = resultSet.getObject(1);            
       } 
       else { 
        ArrayList<Object> arrayResultSet = new ArrayList<Object>(); 
        for (int i = 1; i <= numberOfColumns; i++) { 
         arrayResultSet.add(resultSet.getObject(i));       
        }      
        allResultList.add(arrayResultSet);      
       }     
      } 
      else      
       break;     
      }   
    } 
    catch (SQLException sqlEx) { 
     while(sqlEx != null) { 
      System.err.println("SQLException information"); 
      System.err.println("Error msg: " + sqlEx.getMessage()); 
      System.err.println("SQLSTATE: " + sqlEx.getSQLState()); 
      System.err.println("Error code: " + sqlEx.getErrorCode()); 
      sqlEx.printStackTrace(); 
      sqlEx = sqlEx.getNextException(); 
     } 
    }   
    finally { 
     try { 
      resultSet.close(); 
      statement.close();    
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     }  
    }      
} 

public void preQueryConnectDB(String query,String expression) { 
    try {    
     preS = connection.prepareStatement(query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     preS.setString(1, query); 
     resultSet = preS.executeQuery();    
     ResultSetMetaData metaData = resultSet.getMetaData(); 
     int numberOfColumns = metaData.getColumnCount();    

     while (resultSet.next()) {    
      hasRow = true; 
      if (isReturn) {     
       if (numberOfColumns == 1) { 
        resultSet.last(); 
        int rowCount = resultSet.getRow(); 
        resultSet.first(); 

        if (rowCount == 1)       
         returnObj = resultSet.getObject(1);            
       } 
       else { 
        ArrayList<Object> arrayResultSet = new ArrayList<Object>(); 
        for (int i = 1; i <= numberOfColumns; i++) { 
         arrayResultSet.add(resultSet.getObject(i));  
        }       
        allResultList.add(arrayResultSet);      
       }     
      } 
      else     
       break;     
     }    
    }catch (SQLException sqlEx) { 
     while(sqlEx != null) { 
      System.err.println("SQLException information"); 
      System.err.println("Error msg: " + sqlEx.getMessage()); 
      System.err.println("SQLSTATE: " + sqlEx.getSQLState()); 
      System.err.println("Error code: " + sqlEx.getErrorCode()); 
      sqlEx.printStackTrace(); 
      sqlEx = sqlEx.getNextException(); 
     } 
    }  
    finally { 
     try { 
      resultSet.close(); 
      preS.close();     
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }      
} 

public void closeDBConnection() { 
    try { 
     connection.close();    
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void setIsReturnData(boolean isReturn) { this.isReturn = isReturn; } 

public void setConnectionURL(String query) { 
    String dbName = ""; 
    String newURL = ""; 
    int beginIndex = -1; //string from in index is positive 
    int endIndex = -1; //string : in index is positive 
    beginIndex = query.indexOf("FROM"); 
    endIndex = query.indexOf(":"); 
    dbName = query.substring(beginIndex+4, endIndex).trim(); 
    newURL = "jdbc:informix-sqli://hwae5500:shme5500/"+dbName+":INFORMIXSERVER=shme5500;"; 

    if (!newURL.equals(dbURL)) { 
     dbURL = newURL; 
     try { 
      if (connection != null) 
       connection.close(); 
       Class.forName("com.informix.jdbc.IfxDriver"); 
       connection = DriverManager.getConnection(dbURL); 
     }catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     catch(ClassNotFoundException drvEx) { 
      System.out.println("Driver fail"); 
      drvEx.printStackTrace(); 
     }  
    }   
} 

public void recoverDefultValue() { 
    this.statement = null; 
    this.preS = null; 
    this.resultSet = null; 
    this.hasRow = false; 
    this.isReturn = false;  
    this.returnObj = null;  
} 

public boolean getHasRow() { return hasRow; } 

public Object getReturnObj(){ return returnObj; } 

//get all resultSet in Object type 
public ArrayList<ArrayList<Object>> getAllResultList() { return allResultList; } 
} 

//the class receive query result and process data 
pubblic class DataProcessing { 
     . 
     . 
     . 
    public void generateInformation() { 
     . 
     . 
     . 
     sqlQuery = "SELECT * FROM AFFIL:AFPOPF1 WHERE PRTDAT="+"'"+dateStr+"'"+ 
      "AND FCERNO[2]='C' AND LENGTH(FCERNO)=9 "+ 
     "AND SOLIN1 LIKE '"+bs_SOLIN1+"' ORDER BY POLYN1,FCERNO"; 

     db.recoverDefultValue(); 
     db.setIsReturnData(true); 
     db.setConnectionURL(sqlQuery); 
     db.connectDB(sqlQuery); 
     if (db.getHasRow()) { 
      setDataList(db.getAllResultList(),1);//Object type to Afpopf1 type 
      sw_DATA = true;     
     } 
     . 
     . 
     . 
     if (codeStr.charAt(0) == '0') {    
      sqlQuery = "SELECT DEPTWN FROM COMLIB:DEPTPF1 WHERE DEPTNO=?"; 
      db.recoverDefultValue(); 
      db.setIsReturnData(true); 
      db.setConnectionURL(sqlQuery);   
      for (TableAfpopf1 tafp : Afpopf1List) {    
       db.preQueryConnectDB(sqlQuery,tafp.getPolyn1()); 
       wk_DEPTWN = setVarwk_DEPTWN((String)db.getReturnObj()); 
      }   
     } 
      . 
      . 
      .   
    } 

private void setDataList(ArrayList<ArrayList<Object>> allResultList,int choiceNum)                
{ 
    int inputindex = 0; 
    DateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");   
    if (choiceNum == 1) { 
     for (int i=0; i<allResultList.size(); i++) {     
      TableAfpopf1 afpItem = new TableAfpopf1(); 
      for (Object obj : allResultList.get(i)) { 
       switch (inputindex+1) { 
       case 1: 
        afpItem.setFcerno((String)obj); 
        break; 
       case 2: 
        afpItem.setPolyn1((String)obj); 
        break; 
        . 
        . 
        . 
       case 58:        
        try { 
         Date date = sdf.parse(obj.toString()); 
         afpItem.setChkdat(date);         
        } 
        catch (Exception e) { 
         System.out.println("error appear"); 
         e.printStackTrace(); 
        }           
        break;  
      }     
      inputindex++; 
     } 
     Afpopf1List.add(afpItem);    
     }   
    } 
    else if (choiceNum == 2) { 

    } 
}  

}


내가 생각 setDataList()와 setDataList()가 좋은 방법이 아니다. java에서 프로그램을 구현할 때 setDataList() 메서드는 Afpopf1에만 매핑되고 및 DB 테이블의 각 변수를 매핑하는 대소 문자를 씁니다. 이는 효과적인 코드 및 바보가 아닙니다. 그런 다음, 4gl 프로그램에 새로운 테이블 변수가 있으면 그 테이블에 데이터를 수신 할 다른 메소드를 작성해야합니다.

나는 좋은 생각이라고 생각하지 않으므로 자바 코드를 개선하는 방법을 알고 싶습니다. 또는 java에서 함수를 구현하는 올바른 방법을 말해주십시오. 전에 Java EE를 사용하지 않았습니다.

솔루션이 Java EE에 관한 것이면 그 대답이 자세하게 설명되었거나 몇 가지 예제 코드가 포함되기를 바랍니다.

답변

4

아마도 실망 스럽겠지만, 실제로 Spring JDBC 템플릿을 사용하는 방법입니다. 모든 SQL 쿼리에는 적절한 bean 객체로 직접 코딩 된 매핑이 있습니다.

자동으로 수행하려면 원시 JDBC 대신 Hibernate와 같은 ORM을 사용해야합니다.

관련 문제