26

JOOQと呼ばれる優れたSQL ビルダー フレームワークを見つけまし。ところで、ロシア語で JOOQ は「虫」(昆虫のような)、「カブトムシ」を意味する名詞のように聞こえます ;)

JOOQ のパフォーマンスなどについてフィードバックがあれば、共有してください。JOOQに関するブログへのリンクも大歓迎です。

4

3 に答える 3

32

1ヶ月半前にjooqを使い始めたので、ここでも答えるべきだと思います。

次の理由から、jooq のようなツールを使用したかったのです。

  • ORM は、現在のプロジェクト (クラスター用の分散計算プラットフォーム) ではやり過ぎです。データベースから個別のフィールドのみを読み書きする必要があり、完全なテーブル行ではなく、いくつかのクエリは単純で軽量な ORM では実行できないほど複雑です。
  • DB全体を念頭に置く必要がないように、クエリの構文オートコンプリートが必要でした
  • コンパイラがビルド時に基本的なクエリ構文をチェックできるように、クエリを Java で直接記述できるようにしたいと考えていました。
  • ある型の変数を別の型が予期されている場所に誤って渡すことがないように、クエリを型安全にしたかったのです。
  • SQLが欲しかったけど、とても便利で使いやすいものが欲しかった

まあ、jooq で、私はそれをすべて達成することができました。私の主な要件は、jooq が十分に複雑なクエリ (ネストされた、グループ化など) を処理することでした。それは満たされました。

また、できるだけ少ないコード行を使用してクエリを実行できるようにしたいと考えていましたが、jquery のような呼び出しで SELECT を実行できる jooq fluent API を使用してこれに到達することができました。

jooq を使用している途中で、1 つまたは 2 つのバグを報告しましたが、驚くほど早く修正されたと言わざるを得ません。

また、いくつかの機能を見逃していましたが、もう一度言わなければなりませんが、私はすでにそれらのほとんどすべてを持っています.

私がとても気に入ったのは、jooq が SLF4J を使用してパフォーマンスに関する非常に興味深いデータをレポートし、作成した実際のクエリを出力するようになったことです。デバッグにとても役立ちました。

Jooq は、ストアド プロシージャ、UDF、および更新可能なレコードセット用の Java アーティファクトも生成しますが、現在は使用していません。

重要なのは、jooq が DB2、Derby、H2、HSQLDB、MySQL、Oracle、PostGreSQL、SQLite、SQL Server、Sybase SQL Anywhere を透過的にサポートしていることです。かなり広範なリストだと思います。

Jooq はGoogle グループにサポート フォーラムを持っており、Lukas は昼夜を問わず私の愚かな質問にも答える準備ができています。

Jooq は Maven をサポートしています。私の Java プロジェクトはすべて Maven ベースなので、これは私にとって大きな救いです。ジェネレーター用の Maven プラグインがまだありませんが、ジェネレーターを実行するのは簡単なことなので、それは重要ではありません。

jooq を使用してクエリを書いていると、突然発見したのですが、jooq は可能な限り移植可能であるため、コード内で MySQL 固有の機能をほとんど使用しなかったため、クエリが本当に移植可能になっていることがわかりました。SQL拡張機能のサポートも進行中であることを知っているので、そのような特殊性に耐えられない人のために.

私から見た jooq に一瞬欠けているものは何ですか?

まあ、SELECT 以外のステートメント用の流暢な API はありません。これにより、コードが少し複雑になり、UPDATE/DELETE ステートメントの記述が少し複雑になります。しかし、これはすぐに追加されると思います。1.5.9 で実装されました! ハ!私には速すぎます;)

後もう一つ。Jooq には良いマニュアルがありますが、わかりません。構造やアーキテクチャを理解していないだけかもしれません...初めてjooqを使い始めたとき、必要な機能を探して次から次へとページを開きました。例えば、jooqのマニュアルのどこにUPDATE文やDELETE文が記述されているか、内容を見て推測してみてください。また、私の観点からすると、マニュアルの何が問題なのか、説明することさえできません。できたら、チケットを1つか2つ投稿します;)

また、Trac には自動の「ここ、あそこ、そして戻る」のようなリンクがないため、手動もあまりナビゲートしにくいものです。

まあ、モスクワ (ロシア) にいる私にとっては、Trac ページも速く開かないので、マニュアルを読むのは少し退屈です。

マニュアルには、寄稿者向けの jooq の優れたアーキテクチャの説明もありません。Jooq は契約による設計の原則に従っているようで、IDE で通常の Ctrl キーを押しながらクリックしていくつかのメソッド名を使用して、特定の機能が内部でどのように実装されているかを知りたいと思ったとき、実装のない鈍いインターフェイス内に行き着きました ;) そうではありません私は頭が良すぎて、すぐに jooq の改善を始めることはできませんが、確かに、jooq が基礎から構造までどのように正確に構築されているかを理解することを楽しみにしています。

また、jooq マニュアルに貢献できないことも残念です。ある種のwikiにあると思っていました。

私が改善したいのは、ニュースが報告される方法 です。そこにあるマニュアルへのリンク、またはこれまたはその新機能がどのように機能するかの例を希望します。

マニュアルのリリース ノートへのリンクは、単なるロードマップです。明日は自分でやろうと思います...

Jooq のコミュニティも現在比較的小規模ですが、コードの品質や新機能の導入方法に影響がないことを報告できてうれしいです。

Jooq は本当に良いプロジェクトです。今後のプロジェクトでもこれに固執します。私は本当にそれが好き。

于 2011-05-15T22:08:54.530 に答える
2

また、軽量のORMおよびSQLビルダーであるMentaBeanを確認することもできます。これにより、SQLに可能な限り近づき、ボイラープレートコードに関する多くのヘルプを提供できます。次に例を示します。

プログラムによる構成:

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結合クエリ:

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);
}
于 2011-09-24T19:43:53.543 に答える
0

SQL ビルダー ソリューションのみを探している場合。私はJava用のORMフレームワークであるプロジェクトを1つ持っていますが、それはまだ時期尚早であり、継続的に開発されていますが、データベースの多くの原始的な使用法を処理しています. https://github.com/ahmetalpbalkan/orman

この段階ではドキュメントはありませんが、Java チェーン メソッドのみを使用して安全なクエリを構築し、多くの SQL 操作を処理できます。クラスフィールドをテーブル列にそれぞれマップすることもできます。

クエリのクエリ構築操作の例を次に示します。

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

Java コード:

    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そのフレームワークの開発をあきらめてください!)

おそらくそれはあなたにとってはうまくいかないでしょうが、私のプロジェクトを発表したかっただけです:P

于 2011-05-22T13:09:31.547 に答える