Integer taskId = sqlFactory.select(ID).from(TASK).where(STATUS.equal(TaskStatus.QUEUED)). orderBy(LAST_UPDATED).limit(1).fetchOne(ID);
ご覧のとおり、クエリを作成して単純な型で実行すると、1行かかります。 jooqについて少し:
私たちに何が良いですか?
- MySQL 5.1.41 / 5.5.8、Oracle XE 10.2.0.1.0、DB2 9.7、PostGreSQL 9.0、H2 1.3.154、HSQLDB 2.1.0、SQLite、Derby 10.7をサポート
- Sybase、MSSQL、Ingres、Firebirdのサポート予定
- テーブル/フィールドだけでなく、ビュー、ストアドプロシージャ、UDF、MySQLのENUMなどの複合型、Blobのコード生成のサポート(通常のバイト[]として表すことができます)
- データベーススキーマ全体がクラスで表されるため、言語はIDEでオートコンプリートを構築します
- 適切に使用した場合、SQLインジェクションの脆弱性はありません-jooqはクエリでパラメーターテンプレートを使用します
- ほとんどの場合、データベースに依存しない構文
- ジェネリック型を使用すると、コードをコンパイルする場合でも十分な数のチェックが提供されます。 さらに、データベーステーブルの列の名前を突然変更した場合、コードの修正を忘れることはありません。 データベースの解析を繰り返した後、誤ったコードは単にコンパイルされません
- 基本的なActiveRecordサポート(データベースから取得したレコードを変更して、1行または2行で書き戻すことができます)
- SELECTクエリだけでなく、INSERT、UPDATEもサポートします。
- ネストされたクエリ、任意のフィールド、集計関数、UNIONクエリ、算術演算、その他の操作のサポート
- クエリ実行の結果を取得するための便利なメソッドは、fetch()、fetchAny()、fetchLazy()、fetchMap()などです。
- 内部Jooqデバイスのプロファイリングを含む、優れたSLF4Jサポート。
- 多くのことが計画されています
- 著者は常にインターネットを使用しており、 jooq Google Groupの質問やバグトラッカーのチケットに非常に迅速に回答しています 。
- Mavenサポート。 Jooqディストリビューションは、 Maven Centralから入手できます。
- 両方のDSL構文のサポート(select()。From()。Where())クエリ構築とOOP (a = new Query(); a.addSelect(); a.addFrom())
- クエリ結果とクエリオブジェクト自体はシリアル化可能です。
何が問題なのですか?
- SELECTの「FOR UPDATE」や「index usage hints」などの特定の言語機能の直接的なサポートはありませんが 。 しかし、 回避策があります。
- 同じクラスの複数のテーブルで作業する場合、インポートスタティックを使用するのが難しい場合があり、クエリの外観が複雑になります(上記の例に関する例)。
Integer taskId = sqlFactory.select(Task.ID).from(Task.TASK).where(Task.STATUS.equal(TaskStatus.QUEUED)). orderBy(Task.LAST_UPDATED).limit(1).fetchOne(Task.ID);
- クエリを実行して結果をクロールするときの小さなオーバーヘッド(おそらく数十から数百マイクロ秒と小さいと思いますか?)
- MySQLではLAST_INSERT_ID()の即時サポートはありません 。 しかし、 回避策があります。 シーケンスがサポートされています。
主観性
- GitHubにはまだコードがありません;)、主な開発はSubversionで行われています
- SourceForgeプロジェクトのページは少し遅く、少し面倒です。
- マニュアルは非常に詳細に見えますが、いくつかのシンプルだが有用なものが欠落しています。 また、私にはあまり快適ではないように思えました。 「チップ」、「バン」、およびアメニティなしの最も基本的なもののみを説明しています。 ただし、Javaの経験が長い場合は、おそらく自分ですぐに到達できます。 さらに、それはあまりにもよく構造化されていないように思えました。 それに関する情報が広まっています。 私はいつも急いでいる必要があり、私にとっては良いマニュアルを持っている必要があります...
- 集約されたフィールドを操作するための構文はあまり便利ではありません(いずれにせよ、他の方法でこれを便利に行う方法はまだわかりません)
Field<Integer> jobTypeCountField = Job.JOBTYPE_ID.count().as("JOBTYPE_ID_COUNT"); Result<Record> jobTypeCountRecord = null; jobTypeCountRecord = sqlFactory.select(Job.JOBTYPE_ID, jobTypeCountField).from(Job.JOB) .where(Job.STATUS.equal(JobStatus.EXECUTING)).groupBy(Job.JOBTYPE_ID).fetch(); for (Record record : jobTypeCountRecord) { System.out.println(record.getValue(Job.JOBTYPE_ID) + " - " - record.getValue(jobTypeCountField)); }
ただし、この主題に関する意見は異なる場合があります。 このようなコードは、誰かにとってより理解しやすいように思われます。
- バージョン2.0では、 非常に興味深いパンが計画されています。
- 非wikiドキュメント(Trac)およびその上であまり便利ではないナビゲーション。 ただし、Ctrl-Qですべてを理解するには、コード内でjavadocで十分です。 しかし、Tracはあまり便利ではないと思うので、欠点を見つけます...
- これまでのところ、 比較的 少数のユーザー。
Jooq アナログ
- Querydsl
- SQL Construction Kit (ドキュメントは見つかりませんでした)
より多くの類似物、わずかに異なる計画
連絡先の詳細:
- プロジェクトのウェブサイト-http://www.jooq.org
- マニュアル: http : //sourceforge.net/apps/trac/jooq/wiki/Manual
- フォーラム-http://groups.google.com/group/jooq-user
- SVN情報: https : //sourceforge.net/scm/? type=svn &group_id=283484
Jooqソースからのいくつかの例(MySQLのinformation_schemaデータベースを使用)
おそらく、ここの例を見て、 Gishiの構文を強調して見た方が良いでしょう。
select(KeyColumnUsage.CONSTRAINT_NAME, KeyColumnUsage.TABLE_NAME, KeyColumnUsage.COLUMN_NAME) .from(KEY_COLUMN_USAGE).join(TABLE_CONSTRAINTS) .on(KeyColumnUsage.TABLE_SCHEMA.equal(TableConstraints.TABLE_SCHEMA)) .and(KeyColumnUsage.TABLE_NAME.equal(TableConstraints.TABLE_NAME)) .and(KeyColumnUsage.CONSTRAINT_NAME.equal(TableConstraints.CONSTRAINT_NAME)) .where(TableConstraints.CONSTRAINT_TYPE.equal(constraintType)) .and(KeyColumnUsage.TABLE_SCHEMA.equal(getSchemaName())) .orderBy(KeyColumnUsage.TABLE_NAME.ascending(), KeyColumnUsage.ORDINAL_POSITION.ascending()).fetch()
for (Record record : create().select( ReferentialConstraints.CONSTRAINT_NAME, ReferentialConstraints.TABLE_NAME, ReferentialConstraints.REFERENCED_TABLE_NAME, ReferentialConstraints.UNIQUE_CONSTRAINT_NAME, KeyColumnUsage.COLUMN_NAME) .from(REFERENTIAL_CONSTRAINTS) .join(KEY_COLUMN_USAGE) .on(ReferentialConstraints.CONSTRAINT_SCHEMA.equal(KeyColumnUsage.CONSTRAINT_SCHEMA)) .and(ReferentialConstraints.CONSTRAINT_NAME.equal(KeyColumnUsage.CONSTRAINT_NAME)) .where(ReferentialConstraints.CONSTRAINT_SCHEMA.equal(getSchemaName())) .orderBy( KeyColumnUsage.CONSTRAINT_NAME.ascending(), KeyColumnUsage.ORDINAL_POSITION.ascending()) .fetch()) { String foreignKey = record.getValue(ReferentialConstraints.CONSTRAINT_NAME); String foreignKeyColumn = record.getValue(KeyColumnUsage.COLUMN_NAME); String foreignKeyTableName = record.getValue(ReferentialConstraints.TABLE_NAME); String referencedKey = record.getValue(ReferentialConstraints.UNIQUE_CONSTRAINT_NAME); String referencedTableName = record.getValue(ReferentialConstraints.REFERENCED_TABLE_NAME); TableDefinition foreignKeyTable = getTable(foreignKeyTableName); if (foreignKeyTable != null) { ColumnDefinition column = foreignKeyTable.getColumn(foreignKeyColumn); String key = getKeyName(referencedTableName, referencedKey); relations.addForeignKey(foreignKey, key, column); } }