2016-10-21 7 views
0

우리는 현재 응용 프로그램이 특정 형식의 파일에서 입력을 받아서 MySQL에 테이블을 만들고 데이터로 채우는 학교 프로젝트를 진행하고 있습니다. 이것을 코딩하는 동안 나는 많은 의존성을 사용했다는 것을 알았습니다. 이전에 읽은 것은 나쁜 습관입니다. 커플 링 줄이기는 아직 큰 주제가 아닙니다. 주변을 검색해 보면 인터페이스에 대한 대부분의 답변을 발견했습니다. 나는 그들이 나를 위해 충분한 대답이 분명하다고 생각하지 않으며, 반복적 인 방법을 사용하지 않으면 도움이되지 않는다.JDBC - loose coupling

코드에서 커플 링을 느슨하게 할 수 있습니까? 어떤 좋은 일반적인 팁과 트릭?

PS : 무효 showTablestringBuilderShowTable 구현,도 작동하지 않습니다.

public class DBService { 
    DBConnection dbc; 
    Connection con; 
    //Statement stmt; 


    public DBService() 
    { 
     dbc = new DBConnection(); 
     con = dbc.getConnection(); 
    } 

    public void copyFile(String fileName, String tableName) throws SQLException { 
     DataManager dm = new DataManager(); 
     dm.sortData(fileName); 
     createTable(fileName, tableName, con); 
     insertData(fileName, tableName, con); 

    } 
    public void showTable (String tableName) 
    { 
     try { 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery 
        ("SELECT * FROM " + tableName); 
      System.out.println("id name job"); 
      while (rs.next()) { 
       int id = rs.getInt("id"); 
       String name = rs.getString("name"); 
       String job = rs.getString("job"); 
       System.out.println(id+" "+name+" "+job); 
      } 
     } 
     catch(SQLException e){ 
      System.out.println("SQL exception occured" + e); 
     } 

    } 

    public void createTable(String fileName, String tableName, Connection con) throws SQLException { 
     try (Statement stmt2 = (Statement) con.createStatement()) 
     { 
      String query1 = stringBuilderMeta(fileName, tableName); 
      stmt2.execute(query1); 

      if (stmt2.getWarnings() == null) 
      { 
       System.out.println("\n### Table " + tableName + " is created"); 

      } else 
      { 
       System.out.println("### " + stmt2.getWarnings()); 
      } 
      stmt2.close(); 
     } 
    } 

    public void insertData(String fileName, String tableName, Connection con) throws SQLException 
    { 
     try (Statement stmt = (Statement) con.createStatement()) 
     { 
      String query1 = stringBuilderData(fileName, tableName); 
      stmt.execute(query1); 

      if (stmt.getWarnings() == null) 
      { 
       System.out.println("\n### Table " + tableName + " has been successfully filled"); 

      } else 
      { 
       System.out.println("### " + stmt.getWarnings()); 
      } 
      stmt.close(); 
     } 
    } 
    public String stringBuilderMeta(String fileName, String tableName) 
    { 
     DataManager dm = new DataManager(); 
     dm.sortData(fileName); 


     StringBuilder builder = new StringBuilder(); 
     builder.append("" + "Create table ").append(tableName).append(" (\n"); 

     for (int i = 0; i < dm.fileMetaData.size();i++) { 
      DataFromFile d = (DataFromFile)dm.fileMetaData.get(i); 
      String test = d.getName(); 
      String test2 = d.getDatatype(); 
      String test3 = d.getLimit(); 
      if(i < (dm.fileMetaData.size()-1)) 
      { 
       builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n"); 
      } 
      else{ 
       builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n"); 
      } 

     } 
     builder.append(");"); 




     String string = builder.toString(); 
     return string; 
    } 

    public String stringBuilderShowTable(String fileName, String tableName) 
    { 
     DataManager dm = new DataManager(); 
     dm.sortData(fileName); 


     StringBuilder builder = new StringBuilder(); 
     //builder.append("" + "SELECT * FROM " + tableName + "" 

     for (int i = 0; i < dm.fileMetaData.size();i++) { 
      DataFromFile d = (DataFromFile)dm.fileMetaData.get(i); 
      String test = d.getName(); 
      String test2 = d.getDatatype(); 
      String test3 = d.getLimit(); 
      if(i < (dm.fileMetaData.size()-1)) 
      { 
       builder.append(test).append(" ").append(test2).append(" (").append(test3).append("),\n"); 
      } 
      else{ 
       builder.append(test).append(" ").append(test2).append(" (").append(test3).append(")\n"); 
      } 

     } 
     builder.append(");"); 




     String string = builder.toString(); 
     System.out.print(string); 
     return string; 
    } 

    public String stringBuilderData(String fileName, String tableName) 
    { 
     DataManager dm = new DataManager(); 
     dm.sortData(fileName); 
     int counter = 0; 
     int counter2 = dm.reader.wordsPerLine; 

     StringBuilder builder = new StringBuilder(); 

     for(int j = 0; j < dm.boo; j++) 
     { 
      builder.append("" + "INSERT INTO ").append(tableName).append (" ("); 
      for (int i = 0; i < dm.fileMetaData.size(); i++) { 
       DataFromFile d = (DataFromFile) dm.fileMetaData.get(i); 
       if (i < (dm.fileMetaData.size() - 1)) { 
        builder.append(d.getName()).append(", "); 
       } else { 
        builder.append(d.getName()); 
       } 

      } 
      builder.append(")\n").append("VALUES ("); 
      for (int i = counter; i < counter2; i++) { 
       if (i < (counter2 - 1)) { 
        builder.append("'" + dm.fileData.get(i) + "'" + ","); 
       } else { 
        builder.append("'" + dm.fileData.get(i) + "'"); 
       } 
      counter++; 
      } 
      counter2 = counter2+dm.reader.wordsPerLine; 
      builder.append(");\n"); 
     } 
     String string = builder.toString(); 
     System.out.print(string); 
     return string; 
    } 
} 

답변

0

큰 질문입니다. 표준 애플리케이션 아키텍처에 들어가는 많은 부분은 디커플링 (및 관련 문제, 관심의 분리)과 관련이 있습니다.

당신은 기존의 OO 디자인 패턴에서 몇 가지 아이디어를 얻을 수 있습니다 https://en.wikipedia.org/wiki/Design_Patterns

정의 역할과 객체의 협력 갖는 (아마도 건축 층으로 나누어, 그리고 일반적으로 인터페이스를 통해 상호 작용하는) 하나 개의 기술이다. 애플리케이션은 사용자에게 물건을 보여주기위한 프리젠 테이션 레이어 (MVC 구조로 나누어 짐), 데이터베이스와의 대화를위한 데이터 액세스 레이어, 그리고이 모든 것을하는 한 객체 대신에 서비스 레이어를 가질 수 있습니다. 전체 코스는 이러한 유형의 아키텍처 레이어를 통해 출혈이없는 객체를 작성하는 데 전념 할 수 있습니다.

"제어 반전"또는 "종속성 삽입"을보고 싶을 수도 있습니다. 이것에 대한 몇 가지 프레임 워크가 있지만 기본 개념은 다음과 같습니다. 클래스는 SomeDependencyNeed 인터페이스를 구현하는 객체를 사용해야하지만 직접 myVariable = new ImplementationOfSomeDependencyINeed();이라고 말하면서 SomeDependencyINeed 참조 (생성자 인수 , 또는 setter 메소드). Spring과 같은 프레임 워크는 의존성 인스턴스를 제공 ("삽입")하는 "제어 컨테이너의 반전"(또는 IoC 컨테이너)을 제공한다. 또는 프레임 워크가 없으면 일종의 빌더 또는 confgurer 객체를 그 책임과 함께 가질 수 있습니다.

문제는 일반적으로 학교 프로젝트가 충분히 크지 않으며, 더 중요하게는 일반적으로 이러한 기술의 이점을 보여주기 위해 오래 유지되지 않습니다. 학생이하는 경우 모든 비용을 볼 수 있습니다. 시작하고 실행하는 데 시간이 오래 걸리는 경우가 있습니다. 때로는 불필요 해 보이는 특정 방법을 사용하지만 대개는 위쪽이 보이지 않습니다.

+0

정교한 설명을 작성해 주셔서 감사합니다. 나는 이제 의존성 주입을 찾아 보았고 유용한 설명과 예제를 발견했다. 의견의 마지막 부분을 찾으려면 :이 프로젝트는 학기의 뒷부분에서 사용됩니다. 그래서 더 추상적이고 더 느슨한 결합을 사용하면 너무 많이 다시 작성하지 않아도됩니다. 다시 귀하의 회신에 감사드립니다. –