2012-06-03 3 views
3

이것은 데이터베이스에 연결해야 할 때 항상 겪게되는 문제입니다. 일반적인 Java 코드에서 SQL을 분리하는 방법은 무엇입니까? 난 보통 데이터베이스 연결을 위해 별도의 클래스를 사용하지만 각 데이터베이스에 여러 개의 데이터베이스와 여러 테이블이있을 때는 항상이 작업을 수행하기가 어렵습니다.Java 코드에서 SQL 분리하기

예를 들어, 모든 java DBConnector.java라는 이름의 클래스에서 SQL을 사용하는 경우, 삽입, 삭제, 데이터 검색 등을 총괄적으로 어떻게 코드합니까? 모든 SQL 문은 같은 클래스에 있어야하며 데이터베이스 응용 프로그램의 범위 내에서 동일한 작업의 여러 가지 기능과 호환되어야하므로 나머지 코드와의 논리적 구분이 가능해야한다는 것이 이상적인 경우라고 생각합니다.

public void insertData (String db, String table, <Whatever Fields to be Inserted>) 
{ 
    //generic SQL INSERT statement and execution 
} 

public ResultSet retrieveData (String db, String table, <Whatever Fields Relevant>) 
{ 
    //generic retrieval of data 
} 

어떤 방법이 있을까요? 또는 삽입, 쿼리 등 다양한 기능을 추가해야합니까?

감사합니다.

답변

5

사운드 아키텍처를 원할 경우 적어도 몇 개의 레이어를 사용하여 염려 할 필요가 있습니다.

우선, 모델 클래스로 시작하십시오. 대부분의 경우 데이터베이스의 모든 테이블에 하나씩 필요합니다. 직접 작성하거나 ORM (예 : EclipseLink, Hibernate)을 사용하여 자동으로 생성하십시오. 이들은 POJO (Plain Old Java Objects) 여야합니다. 즉, 속성이 simple 인 객체 (예 : Name 유형 문자열, Id 유형 정수 ... 등)입니다. 모델 개체는 데이터의 운반자 여야하며 더 이상은 아닙니다 (확실히 논리 또는 처리가 없습니다).

그런 다음 모든 모델 클래스에 대해 DAO (데이터 액세스 개체)를 만듭니다 (원하는 경우 상속하도록 GenericDao 클래스를 빌드 할 수 있습니다). 여기서는 모델 개체를 인수로 취하는 메서드를 통해 CRUD 작업 (삽입, 업데이트, 삭제)을 제공합니다. 원하는 경우 데이터베이스에 독립적 인 DAO 계층을 삽입 할 수 있지만 데이터베이스 백엔드에만 해당됩니다.

셋째는 서비스 또는 관리자 클래스의 논리 그룹 당 층 (모든 프론트 엔드와 컨트롤러 코드는 모든 기능 원에 대해 이야기해야하는 계층이다)이있다. 일반적인 방법은 registerCustomer(...) (다른 DAO 클래스를 사용할 수도 있음)이라고 할 수 있습니다. 또는 findCustomerByName()

MVC (Model - View - Controller)라고하는 응용 프로그램을 구조화하면 더 자세한 정보가 필요하면 google에 대한 용어입니다.

이 방법을 사용하면 일반적으로 응용 프로그램이 유지 보수 가능하고 나중에 백엔드를 변경하는 것이 더 쉽다는 것을 의미하는 DAO 계층보다 높은 SQL 쿼리가 생성되지 않습니다.

+0

일반적이고 상세한 답변을 보내 주셔서 감사합니다. 기술 독립 솔루션을 찾고있었습니다. – Izza

2

가장 좋은 방법은 업계 표준 인 Hibernate을 사용하는 것입니다.

간단히 말해서, 필요한 SQL을 생성하고 코드는 행을 나타내는 Java 객체를 처리합니다. setter를 호출하면 Hibernate는 업데이트를 수행하는 데 필요한 SQL을 파악합니다.

shoppingCart.getCustomer().getCountry().getCode(); 

을 그리고 SQL이 customer 테이블을 통해 country 테이블에 shopping_cart 테이블에서 얻을 필요 조인에서 수치를 최대 절전 모드 :

게터를 들어, 코드 예처럼 보일 수 있습니다.

정말 멋지고 전환 할 가치가 있습니다.

+0

나는 Hibernate가 ** best ** 옵션이라는 것을 그렇게 뻔뻔스럽게 말하지 않을 것이다. 예를 들어, MyBatis는이 문제에 대한 경량의 대안으로 훨씬 빠르고 이해하기 쉽습니다 (장면의 "마법"보다 훨씬 덜). – bezmax

+0

나는 확실하지 않다 ... – Sajmon

+0

이것은 질문에 대한 답변이 아니므로 SQL을 작성하고자하는 사람에게 ORM을 권하는 것은 누군가에게 케이크를 구우는 방법에 대한 도움을 요청할 때 케이크를 사라고 말하는 것과 같습니다. –

2

Izza는 여기에 자바 코드에서 SQL 분리에 대한 논의가 : Java - Storing SQL statements in an external file 귀하의 솔루션은 이해할 수 있지만, 쿼리 (예를 들어, 단지 어디 = 10 STANDART되지 않는 경우 몇 가지 문제가있을 것이다, 그러나 포함 (...) 또는 그룹을 사용하지 않기를 권합니다. Java에서 DB로 작업 할 때 상용구 코드를 최소화하려면 Spring JDBC를 사용해야하며, 가능하다면 최대 절전 모드를 사용할 수도 있습니다.

1

DAOFactory을 사용해야합니다.이 클래스는 연결을 가져 오는 데 사용됩니다. 데이터베이스에 테이블을 반영하려면 엔터티를 나타내는 DTO - Data Tranfer Objects을 만들어야합니다. 따라서 테이블이 User 인 경우 속성과 getter 및 setter가있는 UserDTO.java을 작성하십시오. 그리고 데이터베이스와의 통신을위한 클래스는 DAO - Data Access Object입니다. 데이터베이스에서 데이터를 가져 오기위한 SQL 구문과 메소드를 여기에 만들어야합니다. 첫 번째 장소에서 잘 설계된 구조. 그러면 코드가 더 깨끗하고 빠르고 안전합니다. 자신 만의 ORM을 만드는 것이 좋습니다. 그래서, 모양과 다른 프레임 워크


EasyORM

double count = 0; 
TransDB trans = new TransDB() ; 
List<Trans> list = new ArrayList<Trans>(); 
list = trans.getAll(); 
for (Trans element : list) 
{ 
count+= element.getData(); 
} 
... 

최대 절전 모드

double count = 0; 
Session session = null; 
List<Trans> list = new ArrayList<Trans>(); 
list = HibernateUtil.getSessionFactory().openSession(); 
list = (List<Trans>) session 
.createQuery("from Trans").list(); 
for (Trans element : list) 
{ 
count += element.getData().doubleValue(); 
} 
... 

과 비교 몇 가지 검사를 ??

평가

EasyORM (밀리 초) : MySQL의 : 초기화 - 4868 MS SQL - 평균, 6344 : - 평균, 8126 - 초기화 6752

최대 절전 모드 : MySQL의 : 초기화 - 27,406, 평균 - 23,728 MS SQL : 초기화 - 28605 (+ 250 %)는 평균 - 24,912

그래서 실제로 SQL script에서 생성 ORM는 주문 FA의 자신의 당신의 ~ 최대 절전 모드 (~ 10)보다 ? 사이에 삽입함으로써 확실히 처리량을 향상시킬 수 없습니다. 이것은 단지 하나의 시험이며, 나는 다른 시험도 있습니다. 그럼 나에게 당신이 자신의 ORM을 만들 것을 권유한다. 여기에 시간 낭비와 같은 단점이있다. 예를 들어 DMS이 사용되지만, 생성 된 명령을 완전히 제어 할 수있는 이점이있다. 특정 DMS (ORDM, 특수 명령 기타.). 그래서 나는 Hibernate이 최고라고 생각하지 않습니다. 정말로 아닙니다.

+0

'자동화 된 프레임 워크를 최대 절전 모드로 사용하지 마십시오. '- 죄송 합니다만,이 문장은 잘못되었습니다. MyBatis에 대해 조금 읽으십시오 (예를 들어). 기본적으로 SQL 템플릿 엔진입니다. 따라서 JSP에서보기를 만들고 변수를 변수에 전달하면 MyBatis를 "SQL 템플릿"으로 만들고 변수를 변수에 전달합니다. 매우 가볍고 효과적입니다. 또한 거기에 다른 유사한 솔루션이 있다고 확신합니다. – bezmax

+0

오케이, 내 잘못은 그것을 편집 할 것입니다. – Sajmon

+0

하지만 여전히 owm ORM이 Hibernate ok EclipseLink처럼 훨씬 빠르다. 왜 내가 내 게시물을 뽑았는지 모르겠다. (내가 편집 한 실수를 제외하고, 미안하다.) 나는 생각한다. 첫 번째 장소는 IS의 성과와 속도입니다. – Sajmon