2011-04-11 2 views

답변

32

나는 1 달 반 동안 jooq를 사용하기 시작했기 때문에 여기에 대답해야한다고 생각한다. 그래서 나는 그것에 대한 경험이있다.

내가 때문에 jooq 같은 도구를 사용하고 싶었 :

  • ORM 내 현재 프로젝트의 잔인한 (클러스터 분산 계산 플랫폼)입니다 내가 읽고 DB에서만 별도의 필드를 작성해야하기 때문에, 완료되지 테이블 행 및 일부 쿼리는 간단하고 가벼운 ORM으로 실행되지 않을 정도로 복잡합니다.
  • 내 전체 DB를 염두에 둘 필요가 없도록 쿼리에 구문 자동 완성이 필요했습니다.
  • Java에서 쿼리를 직접 작성하여 컴파일러에서 기본 쿼리 구문을 확인할 수 있도록하고 싶었습니다.
  • 실수로 다른 유형이 예상되는 한 유형의 변수를 전달할 수 없도록 내 쿼리가 유형 안전성이 필요했습니다.
  • 나는 SQL을 원하지만 난 jooq와 내가 모든 것을 달성 할 수 있었다, 그것은 매우 편리하고 쉽게

음을 사용하고 싶었다. 내 주요 요구 사항은 Jooq가 복잡한 쿼리 (중첩 된 그룹화 등)를 처리하는 것이 었습니다. 그것은 성취되었습니다.

가능한 한 적은 코드 행을 사용하여 쿼리를 실행할 수 있기를 원했고 jooq와 유사한 호출로 SELECT를 수행 할 수있는 jooq 유창한 API를 사용하여이 문제를 해결할 수있었습니다.

jooq를 사용하면서 나는 one or two bugs을보고했는데, 놀랍도록 빨리 수정되었다고 말해야합니다.

나는 또한 missed some features이며, 나는 이미 거의 모든 것을 가지고 있다고 말해야 만합니다.

내가 좋아하는 것은 jooq가 SLF4J를 사용하여 성능에 대한 흥미로운 데이터를보고하고 빌드 한 실제 쿼리를 출력하는 것입니다. 디버깅에 정말 도움이되었습니다.

Jooq는 스토어드 프로 시저, UDF 및 업데이트 가능한 레코드 세트에 대한 Java 아티팩트도 생성하지만, 현재 사용하지는 않습니다.

중요한 점은 jooq가 DB2, Derby, H2, HSQLDB, MySQL, Oracle, PostGreSQL, SQLite, SQL Server, Sybase SQL Anywhere를 투명하게 지원한다는 것입니다. 꽤 광범위한 목록, 제 생각에는.

주크 (Yooq)는 support forum in Google groups입니다. 루카스는 내 질문이 가장 어리석은 곳이라도 밤낮으로 대답 할 준비가되어 있습니다.

Jooq는 Maven을 지원하며 모든 Java 프로젝트는 Maven 기반이기 때문에 저에게 큰 도움이됩니다. 우리는 여전히 생성기에 대한 Maven 플러그인을 놓치지 만, 실행중인 생성기는 케이크 조각이므로 중요하지 않습니다.갑자기 jooq이 가능한 호환성을 시도 이후 거의 코드에서 어떤 MySQL의 특정 기능을 사용하지 않기 때문에 그들이 정말 휴대용되었다는 것을 발견 jooq 내 쿼리을 writting

. 그러한 특성을 가지고 살아갈 수없는 사람들을 위해, SQL 확장에 대한 지원을 알고 있습니다.

jooq가 내 관점에서 잠시 부족한 점은 무엇입니까?

글쎄, SELECT 이외의 문장에는 유창한 API가 없다. 이것은 코드를 조금 복잡하게 만들고 UPDATE/DELETE 문을 약간 더 복잡하게 만듭니다. 그러나 나는 이것이 곧 추가 될 것이라고 생각한다. 1.5.9에서 구현되었습니다! 하아! 나를 위해 너무 빨리;)

그리고 또 하나. 주크 (Jooq)는 훌륭한 매뉴얼을 가지고 있지만 ... 모르겠다. 나는 그것이 단지 구조 나 구조를 이해하지 못할 수도 있습니다. 처음으로 jooq를 사용하기 시작했을 때, 필자는 필요한 기능을 찾기 위해 하나의 페이지를 열었습니다. 예를 들어, jooq manual의 UPDATE 및 DELETE 문이 내용을보고 설명되어있는 곳을 추측하려고 시도합니다.하지만 실제로는 주관적입니다. 나는 또한 설명 할 수조차 없으며, 나의 견해에서 무엇이 잘못되었는지 설명 할 수 없다. 내가, 내가 티켓 또는 두 가지를 게시 할 예정입니다 수있는 경우) Trac의 "가 다시 여기에 '링크 -like에는 자동이 없기 때문에

매뉴얼도 정말 잘 탐색하지 않습니다. 글쎄, 나를 위해 모스크바 (러시아) Trac의 페이지에 빠르게도 그렇게 설명서를 읽고 열리지 않습니다

조금 지루하다.

매뉴얼 또한 기여자를위한 jooq에 대한 훌륭한 아키텍처 설명을 놓치고 있습니다. 주크 (Jooq)는 디자인에 따른 계약 원칙을 따르고 IDE에서 특정 메서드 이름에 대해 Ctrl + 클릭을 사용하여 특정 기능이 어떻게 구현되는지 배우고 싶었지만 구현이없는 무딘 인터페이스로 끝났습니다. 나는 너무 영리해서 jooq를 즉시 개선 할 수는 없지만, 확실히 jooq가 어떻게 땅에서부터 위로 올라 갔는지 이해하는 것을 즐긴다.

우리는 jooq 설명서에 기여할 수 없다는 점도 유감입니다. 나는 그것이 어떤 종류의 위키에있을 것으로 예상했다. 나는 또한 향상시키고 자하는 것이 무엇

the waynews are reported입니다. 이 설명서 나 그 새 기능이 어떻게 작동하는지에 대한 설명서 또는 예제에 대한 링크를 선호합니다.

Release notes link in manual은 실제로 로드맵입니다. 나는 하나의 자신을 내일 ...

Jooq는 현재 상대적으로 작은 지역 사회를 가지고 할 것, 생각하지만, 나는 그것이 코드 품질이나 새로운 기능이 도입되는 방식에 영향을 미치지 않습니다 것을보고 기쁘게 생각합니다.

주크 (Jooq)는 정말 좋은 프로젝트입니다. 나는 미래의 프로젝트를 위해 그것을 고수 할 것이다. 난 정말 좋아.

+0

인터 휴식 :

private BeanConfig getUserBeanConfig() { // programmatic configuration for the bean... (no annotation or XML) BeanConfig config = new BeanConfig(User.class, "Users"); config.pk("id", DBTypes.AUTOINCREMENT); config.field("username", DBTypes.STRING); config.field("birthdate", "bd", DBTypes.DATE); // note that the database column name is different config.field("status", new EnumValueType(User.Status.class)); config.field("deleted", DBTypes.BOOLEANINT); config.field("insertTime", "insert_time", DBTypes.TIMESTAMP).defaultToNow("insertTime"); return config; } // create table Users(id integer primary key auto_increment, // username varchar(25), bd datetime, status varchar(20), // deleted tinyint, insert_time timestamp) 

간단한 SQL 쿼리에 가입하세요! 나는 JOOQ조차도 몰랐다. 나는 그것에 대한 인터 레스트가 없다고 생각한다. (스토어드 프로 시저의 일반 SQL에 대해서는 더 많은 것을, 특정 기능을 사용하는 하나의 DB에 대해서는 최적화했다.)하지만 ORM이라고 설명하는 것으로 보인다. 잘 했어. 이것은 너무 일반적이지 않습니다. 그래서 JOOQ에 오신 것을 환영합니다 –

+1

@ Nicolas Jooq는 ORM이 아닙니다. –

+0

@FractalizeR 2 년 후, [위키는 결국 ORM이라고 생각합니다] (http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software). – yair

0

SQL 빌더 솔루션 만 찾는 경우. Java 용 ORM 프레임 워크 인 하나의 프로젝트가 있지만 여전히 조숙하며 지속적인 개발에서는 데이터베이스의 많은 원시적 인 용도를 처리합니다. https://github.com/ahmetalpbalkan/orman

그러나 그것은 단지 자바 체인 방법을 사용하여 안전한 쿼리를 만들 수 많은 SQL 작업을 처리 할 수있는이 단계에는 문서가 없습니다. 또한 classes-fields를 각각 tables-columns에 매핑 할 수 있습니다.

QueryBuilder qb = QueryBuilder.getBuilder(QueryType.SELECT); 
    System.out.println(qb 
      .from("sailors") 
      .where(
        C.and(
          C.gt("rating", 5), 
          C.lt("rating", 9))) 
      .groupBy("rating") 
      .having(
        C.gt(
          new OperationalField(QueryFieldOperation.AVG, 
        "age").toString(), 20) 
        ).getQuery()); 

이 (! LOL 그냥 프레임 워크를 개발 포기)

대부분의 아마 작동하지 않습니다 : 여기에

SELECT COUNT(*) FROM sailors WHERE 
    rating>4 AND rating<9 GROUP BY rating HAVING AVG(age)>20; 

자바 코드는 쿼리에 대한 샘플 쿼리 작성 작업입니다 하지만 내 프로젝트를 알리고 싶었습니다. P

+0

프레임 워크는 JPA/CriteriaQuery와 비슷합니다. 왜 당신 자신을 만들었습니까? JPA와 다른 점은 무엇입니까? –

+0

왜 jOOQ에 기여하지 않으시겠습니까? :) –

+0

내 프로젝트의 주된 목적은 JPA와 마찬가지로 주석 기반 ORM을 만드는 것입니다. QueryBuilder는 그 기능입니다. 이것은 jooq와는 다릅니다. 'jOOQ는 OR-mapper가 아닙니다. '라고 말했지만 내 것이 맞습니다. –

2

가벼운 ORM과 SQL 빌더 인 MentaBean을 보시면 SQL에 가능한 한 가깝게 앉아 상용구 코드에 대한 많은 도움을 제공 할 수 있습니다. 다음은 그 예이다 :

프로그래밍 구성 : 알고

Post p = new Post(1); 

StringBuilder query = new StringBuilder(256); 
query.append("select "); 
query.append(session.buildSelect(Post.class, "p")); 
query.append(", "); 
query.append(session.buildSelect(User.class, "u")); 
query.append(" from Posts p join Users u on p.user_id = u.id"); 
query.append(" where p.id = ?"); 

stmt = conn.prepareStatement(query.toString()); 
stmt.setInt(1, p.getId()); 

rset = stmt.executeQuery(); 

if (rset.next()) { 

    session.populateBean(rset, p, "p"); 

    u = new User(); 

    session.populateBean(rset, u, "u"); 

    p.setUser(u); 
} 
관련 문제