2016-08-17 2 views
0

SQL 쿼리 빌더 util을 개발하여 SQL 쿼리를 쉽고 빠르게 작성할 수 있습니다. 나는 실제 쿼리 빌더를 위해 정렬 된 기본 사항을 가지고 있지만 데이터베이스 엔터티 (즉 테이블과 열)에 대한 문자열 리터럴/상수에 대한 일부 양식 사용과 관련하여 문제가 있습니다. 각 (방법을 둥지 내가 열거에 꽤 읽었데이터베이스 엔티티 용 Java 빌더 패러다임

String sqlQuery = queryBuilder.select(Tables.Users.FirstName) 
.where(Tables.Users.Age >= 10) 
.build() 
.toString(); 

및하지만 난 모든 테이블에 대한 열거를 만들어야합니다 것처럼 보인다 : 내가하고 싶은 것은 이런 일을하는 것입니다 특정 열을 포함). 가능하다면 모든 테이블과 각 테이블의 모든 열을 포함하는 하나의 클래스를 갖고 싶습니다. 이 날은 단순히 뭔가를 호출하여 문자열 리터럴 "을 구축"할 수 있도록해야합니다

Tables.Address (returns the string value for 'address' table) 
Tables.Address.Country (returns the string value for 'country' column) 

이 내가 열거를 사용하여 지금까지 시도했다하지만 내가 원하는 꽤 것입니다.

public enum Table { 
    Users("users"), 
    Addresses("addresses"), 

    private String tableName; 

    Table(String tableName) { 
     this.tableName = tableName; 
    } 

    public String getName() { 
     return tableName; 
    } 
} 

public enum Column { 
    ID(Table.Users, "id"), 
    NAME(Table.Users, "name"); 

    private Table table; 
    private String columnName; 

    Column(Table table, String columnName) { 
     this.table = table; 
     this.columnName = columnName; 
    } 

    public String getColumnName() { 
     return columnName; 
    } 
} 
+1

기본적으로 테이블은 컴파일시 알려지지 않아야합니다. 따라서 상수의 형태는 적용되지 않습니다. – RealSkeptic

+0

여기서 다루려고하는 데이터베이스 유형에 대한 정보를 좀 더 알려줄 수 있습니다. 메타 데이터는 확실히 갈 수있는 방법이지만, 메타 데이터를 얻는 방법은 DB 공급 업체가 변경 될 때 크게 달라집니다. –

+0

관계형 데이터베이스가 아닌 경우. Java JDBC는 데이터베이스 메타 데이터에 대해 벤더에 독립적 인 액세스를 제공합니다. – duffymo

답변

0

열거 형은 갈 길이 없습니다. 그들은 충분히 유연하지 않습니다. 연결할 각 데이터베이스 스키마의 메타 데이터에 액세스해야합니다.

나는 왜 당신과 같은 솔루션이 SQL을 작성하고 JDBC로 실행하는 것보다 더 나은지 결코 알지 못합니다. SQL 작성과 마찬가지로 빌더를 사용하는 것만큼이나 많은 작업이 필요합니다.

FYI - 당신은 당신이이 문제를 해결하는 첫 번째 시도가 아님을 알고 있습니다. Spring JDBC 템플릿은 상용구를 사용하고 관계형 데이터베이스와의 상호 작용을 통해 작동한다. iBatis는 오랫동안 사용되어 왔으며 입증되었습니다. Hibernate와 같은 ORM 솔루션이 많이 있지만, 너무 길다. 나는 그것들을 추천하지 않을 것이다. JPA는 Java EE 스펙에 내장되어 있습니다.

나는이 바퀴를 재발 명한 팀에서 일하고 싶지 않아, 내가 증명할 수있는 범용 솔루션보다 더 좋아지게 만들었습니다.

1

첫째, 나는 왜 당신이 이미 여러 번 발명 된 바퀴를 재발 명하려고하는지 이해하지 못합니다.

따라서 라이브러리를 사용하려면 JOOQ을 사용하십시오. 만약 당신이 정말로 당신의 쿼리 빌더를 개발하고 싶다면 내 프로젝트 BeanCrumbs이 유용 할 것입니다.

+1

제가 일하고있는 프로젝트는 자바에서 데이터베이스 개발자를 더 잘 파악할 수있는 작은 학습 프로젝트입니다. 나는 기초에서 출발하고 앞으로/앞으로 나아가고있다.따라서 SQL 쿼리를 처음 작성하는 것이 필요하다고 느꼈습니다 ... 즉, 간단하고 단순하게 만드는 파도에서 리팩터링을 수행했습니다. 결국 근본적인 기본 원리가 어떻게 작동하는지 명확하게 이해하면 라이브러리를 사용하여이를 달성 할 수 있습니다. 일을하는 방법과 비슷하게 보일지 모르지만 나는 그것이 무엇을 위해 노력하고 있는지 분명히 이해하고 싶습니다. 고맙습니다. – Ronin

+0

학습에 좋은 결과를 가져다 주었으면 좋겠다. 야심적인 프로젝트이지만, 막대기를 사용하면 DB의 각 부분이 어떻게 연동되는지 잘 이해할 수있다. DB. –

0

나는 성공적으로 ActiveJDBC을 사용하고 있습니다. 디자인 원칙의 첫 번째 부분을 참조하십시오. 이는 "컨벤션을 통한 컨벤션"원칙을 적용하는 한도입니다.