2014-02-25 2 views
2

음식 주문을 추적 할 수있는 소규모 레스토랑 관리 앱을 개발 중입니다. 나는 (다른 동료들에게 사용하기 쉽도록) 모든 SQL 질의를 처리 할 클래스를 만들고 있는데, 그렇게하기위한 모범 사례를 알고 싶다. 클래스는 연결/연결 해제/삽입 및 쿼리를 매우 구체적으로 처리하며 기본 매개 변수 만 사용합니다. 나는 다음과 같은 디자인 문제가있다. 예외 처리 (사용자가 처리해야한다면, 나는 그렇지 않은 편이 좋다), 연결 (연결이 다시 설정되어 모든 쿼리에서 닫히거나 일련의 쿼리가 완료된 경우), 결과를 표시하는 방법 (예외를 throw 할 수있는 결과 집합을 가장 우아하게 변환하는 방법은 안정적인 최종 결과 집합을 작성하는 방법).JDBC 접근 자 클래스 모범 사례

TLDR; 래퍼 (wrapper) MySQL 클래스에 가장 적합한 디자인은 클래스의 사용자가 기본 제공 방법 만 사용하면됩니다.

+0

훌륭한 자료를 제공해 주신 모든 분들께 감사드립니다. 그러나 이것은 좋은 스타일을 연습하는 좋은 예입니다. 디자인 질문에 대해 자세히 설명 할 수 있기를 바랍니다. – user3352280

답변

2

2013 년에는 일반 JDBC보다 데이터베이스 액세스를 단순화 할 수있는 프레임 워크가 충분합니다.

좀 더 복잡한 무언가를 보려면 을 보살핌 Active Record와 유사한 API 또는 Hibernate에서 확인하십시오. 그리고 미래의 맛을 원하면 Spring Data을보십시오.

+0

휠을 다시 발명하는 것보다 쉬운 방법이 있지만, 회사에서 제 3 자 소프트웨어를 허용하지 않을 가능성이 있습니다. 그래서 나는 그 질문에 대한 해답에 관심이있다. –

+0

이들은 훌륭한 출처이지만 저급 "롤 - 더 - 소유"구현을 조금 더 원했습니다. 그러나, 나는 어쨌든 이것을 사용하게 될지도 모른다. – user3352280

+0

우리는 2014 년 xD – nachokk

0

요구 사항을 감안할 때 Hibernate 프레임 워크를 사용하는 것이 좋습니다. 그것은 당신이 그것에 언급 한 모든 기능을 가지고 있습니다. 또한 테이블을 간단한 POJO에 직접 매핑하는데도 도움이됩니다.

최대 절전 모드를 사용하면 xml 구성 파일에 원하는 속성을 설정할 수 있으며 원하는대로 원하는 속성을 변경할 수 있습니다. Exception handling은 사용자가 절대로해서는 안될 일이다 - Hibernate는 이것을위한 기능을 제공한다. 테이블을 POJO에 매핑하므로 ResultSet을 쉽게 처리 할 수 ​​있습니다.

+0

나는 이것에 동의하지 않을 것이다. 최대 절전 모드는 단순하거나 가벼운 것이 아닙니다. – duffymo

0

나는 당신 자신의 답변을 제공하려고 노력할 것이다.

API에서 throw 가능한 메소드를 작성하십시오. 이는 일반적인 API 실습입니다. 목록을 작성

하고 fieldName에 키와 반환 된 데이터가있는 의 HashMap으로 채워집니다 반환되는 각 레코드는 값이 다음 추가 할 수 있습니다 :

ResultSet 그냥 List<HashMap<String, dataType>>처럼 List 에의 HashMap 각 레코드에 대해 새 HashMap을 만들고 반복하십시오.

결과 집합에 대해 metaData를 사용하여 반환 된 열의 수와 반환 된 열의 이름을 가져올 수 있습니다.

//rs is a ResultSet 
    rs.getMetaData().getTableName(int Column); 
    rs.getMetaData().getColumnCount(); 

선택 쿼리에 대한 예제 코드 :

private List<HashMap<String,Object>> selectQuery(sql) throws SqlException { 
     //assumption that connection is a global 
     List<HashMap<String, Object>> results = new ArrayList<HashMap<String, Object>>(); 
     HashMap<String, Object> record = null; 
     PreparedStatement pStmt = conn.prepareStatement(sql); 
     ResultSet rs = pStmt.executeQuery(); 
     while (rs.next() { 
      record = new HashMap<String, Object>(); 
      for (int i : rs.getMetaData().getColumnCount()) { 
       record.put(rs.getMetaData().getTableName(i), rs.getString(i)); 
      } 
      results.add(record); 
     } 
     rs.close(); 
     return results; 
    } 

연결 -

그들은 그것을 닫을 때까지 열려있는 연결을 유지합니다. 개발자는 이 항상 연결을 닫아야한다는 것을 충분히 알고 있어야합니다. 누출을 생성하십시오.클래스는

당신은 연결을 획득하고 관리하는 연결 풀을 사용해야 연결 처리 할

:

0

여기에 내 걸릴입니다.

연결 작업/이용 케이스의 각 유닛에 대해 서비스가 획득되어야 단로. 서비스는 풀에서 연결을 획득하여 finally 블록에서 연결을 닫고 트랜잭션을 커밋하거나 롤백합니다.

삽입 할

쉽게 쿼리.

은 매우 구체적 만 기본 파라미터에 걸릴

가 필요한 어떤 데이터를 가지고해야합니다. 당신은 기본적인 것을 모릅니다.

나는 다음과 같은 설계 문제가 : 예외 처리,합니다 ( 사용자가이를 처리해야한다, 나는 그들이하지 선호)

지속성 예외해야 서비스 계층 중 결코 거품. 어떤 일이 일어 났는지는 사용자에게 알려야하지만 예외를 보내서는 안됩니다. 사용자에게 친숙한 메시지가 선호됩니다. 접속

연결은 가능한 한 좁은 범위에 개방한다 (연결이 재 확립 모든 질의하거나 검색어의 세트가 완료에 폐쇄한다). 그것들을 업무 단위/거래 단위와 관련 짓는다. 수영장은 비용을 상환합니다. (I 가장 우아하게, 예외를 발생 결과의 안정적인 확정 설정을 할 수있는 의 ResultSet을 변환하는 방법)

및 결과 표시.

결과 집합은 결코 지속성 계층을 벗어나서는 안됩니다. 그것을 폐쇄하는 책임은 사라질 것입니다. 모든 결과 세트를 오브젝트 또는 오브젝트 콜렉션으로 맵핑하고 리턴해야합니다.

봄 JDBC 템플릿을 살펴보십시오. 이미 많은 부분이 정렬되어 있습니다.

나는 Hibernate를 추천하지 않을 것이다.

+0

죄송합니다. 아마도 명확하지 않았습니다. 이것은 서비스 수준을 벗어나지 않습니다 ("사용자"가 내 팀의 다른 개발자를 의미 함). 내 레이어에서 예외를 처리해야한다고 생각하니, 아니면 상위 레벨로 버블 링하도록하십시오. – user3352280

+0

"다릅니다." 결정할 정보가 충분하지 않습니다. 담요 답을 추천하지 않습니다. 나는 당신의 시스템을 설계하려고하지 않고있다. – duffymo