2012-04-30 2 views
0

Java에서 우리가 사용하는 데이터베이스에 대한 모든 메소드를 포함 할 라이브러리 (Jar 파일)를 작성하려고합니다. 거기에 약 60 개의 방법이 있으므로 더 체계적으로 만들고 싶습니다. 아래에 제공된 예제와 같은 메서드를 호출하고 싶습니다.조직화 된 Java 라이브러리 작성

db.accounts.add(username, password); or db.accounts().add(username, password); 
db.names.delete(name); or db.names().delete(name); 

Java에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

어떻게 구성 되었습니까? 나는 그 질문을 이해하지 못한다. –

+0

db.accounts를 입력 할 때 메소드 관리와 관련된 메소드를 얻는 방식으로 계정 관리와 관련된 메소드를 갖고 싶습니다. – Arya

+0

나는 다음 할 http://stackoverflow.com/questions/10361877/organizing-methods-for-better-accessing-them/10361968#comment13361067_10361968 – Arya

답변

4

당신은 자신에게 문제를 많이 저장하고 일반적인 DAO 작성할 수

package persistence; 

public interface GenericDao<K, V> { 
    V find(K id); 
    List<V> find(); 
    K save(V value); 
    void update(V value); 
    void delete(V value); 
} 

나는 자신의 지속성 클래스를 작성 잊어 줄을 봄 JDBC 템플릿과 같은 입증 된 솔루션을 사용합니다.

이 문제는 여러 번, 여러 가지 방법으로 해결되었습니다. 존재하는 것을 개선하기 위해 무엇을하기를 희망합니까? 이 기능을 개발, 테스트 및 유지 관리하는 데 드는 추가 비용을 어떻게 정당화 할 수 있습니까? 여기

+0

같은 질문을했지만 C#과 관련되어있어 구현하기가 간단했습니다. 내 질문을 오해 한 것 같아. 다음은 C# 질문에 대한 링크입니다. 나는 자바를 위해서 거의 같은 것을 요구하고있다. http://stackoverflow.com/questions/10361877/organizing-methods-for-better-accessing-them/10361968#comment13361067_10361968 – Arya

+0

아니, 나는하지 않았다. 내 대답은 변함이 없다. – duffymo

1

데이터베이스에 연결을위한 내 사용자 지정 라이브러리의 일부 스냅 샷 :

enter image description here

PostgreConnection.java

public class PostgreConnection { 

private static Connection conn; 

public Connection makeConnection(String url, String db, String username, String password) { 
    if (conn == null) { 
     try { 
      Class.forName(Constants.POSTGRES_DRIVER); 

      conn = DriverManager.getConnection(Constants.POSTGRES_URL + url + "/" + db, username, password); 
     } catch (SQLException | ClassNotFoundException ex) { 
      Logger.getLogger(PostgreConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    return conn; 
} 

}

Constants.java

public class Constants { 

    public static String POSTGRES_URL = "jdbc:postgresql://"; 
    public static String POSTGRES_DRIVER = "org.postgresql.Driver"; 
} 

org.ert.model에는 데이터베이스 테이블을 기반으로 필요한 모든 Model을 저장할 수 있습니다.

NotifyCharts.java는

public class NotifyCharts { 

private Integer Id; 
private String revName; 
private Date importDate; 
private Integer pages; 
private Boolean status; 

public Integer getId() { 
    return Id; 
} 

public void setId(Integer Id) { 
    this.Id = Id; 
} 

public Date getImportDate() { 
    return importDate; 
} 

public void setImportDate(Date importDate) { 
    this.importDate = importDate; 
} 

public Integer getPages() { 
    return pages; 
} 

public void setPages(Integer pages) { 
    this.pages = pages; 
} 

public String getRevName() { 
    return revName; 
} 

public void setRevName(String revName) { 
    this.revName = revName; 
} 

public Boolean isStatus() { 
    return status; 
} 

public void setStatus(Boolean status) { 
    this.status = status; 
} 
} 

SQLQuery 기본적인 방법 등 insert, update, delete, etc위한 abstract class이다.

SQLQuery.java

public abstract class SQLQuery<T> { 
    protected void makeStatement(String url, String db, String username, String password) { 
    PostgreConnection connect = new PostgreConnection(); 
    Connection con = connect.makeConnection(url, db, username, password); 

    try { 
     state = (Statement) con.createStatement(); 
    } catch (SQLException ex) { 
     Logger.getLogger(SQLQuery.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public String arrayBuilder(Object[] obj, boolean val) { 
    StringBuilder arr = new StringBuilder(); 

    arr.append("("); 
    for (int i = 0; i < obj.length; i++) { 
     if (i < obj.length - 1) { 
      if (val) { 
       arr.append("'"); 
      } 
      arr.append(obj[i]); 

      if (val) { 
       arr.append("'"); 
      } 

      arr.append(", "); 
     } else { 
      if (val) { 
       arr.append("'"); 
      } 
      arr.append(obj[i]); 
      if (val) { 
       arr.append("'"); 
      } 
     } 
    } 
    arr.append(")"); 

    return arr.toString(); 
} 

public int insertRecord() throws SQLException { 
    StringBuilder query = new StringBuilder(); 

    query.append("INSERT INTO ").append(tableName).append(arrayBuilder(columns, false)).append(" VALUES ").append(arrayBuilder(values, true)); 

    return state.executeUpdate(query.toString()); 
} 

public ResultSet getAll() throws SQLException { 
    StringBuilder query = new StringBuilder(); 

    query.append("SELECT * FROM ").append(tableName); 
    rSet = state.executeQuery(query.toString()); 

    return rSet; 
} 

public abstract void setColsAndVals(T t); 
} 

NotifyChartsSQL.javaorg.ert.sql.impl는 당신이 필요로하는 모든 구현을 저장하는 package되면, abstract class의 구현입니다.

NotifyChartsSQL.java

public class NotifyChartsSQL extends SQLQuery<NotifyCharts> { 

public NotifyChartsSQL(String url, String db, String username, String password, NotifyCharts notify) { 
    makeStatement(url, db, username, password); 
    setColsAndVals(notify); 
} 

@Override 
public final void setColsAndVals(NotifyCharts notify) { 
    Map<String, Object> objects = new HashMap<>(); 
    String[] columns; 
    Object[] values; 

    if(notify.getId() != null) 
     objects.put("id", notify.getId()); 
    if(notify.getRevName() != null) 
     objects.put("rev_name", notify.getRevName()); 
    if(notify.getImportDate() != null) 
     objects.put("import_date", notify.getImportDate()); 
    if(notify.getPages() != null) 
     objects.put("pages", notify.getPages()); 

    objects.put("status", notify.isStatus()); 

    columns = Arrays.copyOf(objects.keySet().toArray(), objects.size(), String[].class); 
    values = objects.values().toArray(); 

    setColumns(columns); 
    setValues(values); 
    setTableName("notify_charts"); 
} 

} 

그리고 마지막으로이 모든 확인이 있는지 확인하려면 사용자 정의 라이브러리를 테스트 test 패키지입니다.

TestMain.자바

public class TestMain { 

public static void main(String[] args) { 
    NotifyCharts notify = new NotifyCharts(); 
    try { 

     notify.setRevName("Test456"); 
     notify.setImportDate(new Date()); 
     notify.setPages(10); 
     notify.setStatus(false); 

     NotifyChartsSQL notCharts = new NotifyChartsSQL("localhost:5432", "charts", "username", "password", notify); 


     int status = notCharts.insertRecord(); 

     if (status == 1) { 
      System.out.println("Success Insert"); 
     } else { 
      System.out.println("Failed Insert"); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(TestMain.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}이 사용자 정의 라이브러리를 만들고 싶어 수동 JDBC을 사용하고 ORM 같은 Hibernate를 사용하지 않을 경우 내가 제안

. 왜냐하면 Hibernate는 이미 필요한 모든 메소드를 제공하기 때문에 당신은 전에 말했던 duffymo처럼 할 수있는 몇 가지 특별한 메소드를 추가하고 싶습니다. 이 사용자 지정 라이브러리 아이디어는 DAOHibernate 구조에서 왔습니다.

감사합니다. 더 조직 된 맞춤 라이브러리를 만들고 싶다면 Design Pattern in Java을 배우십시오.