おそらくJDBIを使用する-いくつかの資料のためにオープンソースプロジェクトのプレゼンテーションを進化させる
小さなプロジェクトの移行に関する注意事項:
クラスの名前を変更しました(インポートを削除してIDEに修正させるほど簡単ではありません):
DBI
-> Jdbi
IDBI
-> Jdbi
DBIException
-> JdbiException
Jdbi
のコンストラクターは、 create()
ファクトリメソッドに置き換えられました。
ResultSetMapper
はRowMapper
に置き換えられ、 map
メソッドには行インデックスがなくなりました。 ResultSetMapper
という名前のクラスがJdbi 3に存在しますが、それは別の目的を果たします。 @Mapper
は@UseRowMapper
に置き換えられます。 $# Jdbi
のregisterMapper()
はregisterRowMapper()
に置き換えられます。
@BindIn
は@BindList
に置き換えられ、StringTemplateは不要になりました。
デフォルトのJdbiテンプレートでは、山かっこは引用符で囲まれていません。つまり、 [ツール]-> [データベース]-> [ユーザーパターン]でパラメーターパターンを構成した後、IntelliJが構文を理解します。
Query
のデフォルトタイプはMap
ではなくなったため、 list()
を直接呼び出すことはできません。 list()
を呼び出す前に、 mapToMap()
を呼び出します。
TransactionStatus
はもう存在しません。
TransactionConsumer.useTransaction()
はHandle
$のみを使用するため、$ Jdbi
のuseTransaction()
メソッドでこれを使用する場合は、 TransactionStatus
引数を削除する必要があります。 Handle
。
TransactionCallback.inTransaction()
はHandle
$のみを使用するため、 Jdbi
のinTransaction()
メソッドでこれを使用する場合は、 TransactionStatus
引数を削除する必要があります。 Handle
。
CallbackFailedException
はもう存在しません。 HandleConsumer
、 HandleCallback
、 TransactionalConsumer
、 TransactionalCallback
などのさまざまな機能インターフェイスは、任意の例外タイプをスローできるようになりました(ただし、不必要なチェックを避けるためにジェネリックを使用して制限されています例外処理)。
SQLオブジェクトのサポートは、デフォルトでは使用できなくなりました。 作成されたJdbi
インスタンスごとに登録する必要があります。
IntelliJのMigrateRefactorは、移行を開始するのに役立ちました。
これをまとめてくれてありがとう@electrum ! これは大きな助けになります
私のプレゼンテーションをレビューすることからのいくつかの追加のメモ:
java.lang.reflect.Type
を使用しますが、v2はjava.lang.Class
使用します。 これは、v3がv2では処理できなかった複雑なジェネリック型シグネチャを処理できることを意味します。-parameters
フラグを有効にしてコードをコンパイルすることにより、SQLオブジェクトメソッドパラメーターの@Bind
アノテーションをオプションにすることができます。StatementLocator
インターフェイスがコアから削除されました。 すべてのコアステートメントは、実際のSQLを受け取ることを期待しています。 同様の概念であるSqlLocator
が追加されましたが、SQLオブジェクトの領域でのみ追加されました。もう1つ: StatementRewriter
はTemplateEngine
とSqlParser
にリファクタリングされました。
リストに追加することが非常に重要なのは、selectの動作です。 それはこれから来ました:
List<Map<String, Object>> rs = h.select("select id, name from something");
これに:
List<Map<String, Object>> rs = h.select("select id, name from something").mapToMap().list();
v3の追加のパワーと柔軟性、および安全性が、冗長性の代償を伴わないことを願っています。
こんにちは@javajosh 、 Map
オブジェクトへのマッピングを思いとどまらせようとしているので、その特定のものがそれほど悪いとは考えていませんでした。 他に何もないとしても、キーの大文字と小文字の区別に関する規則は混乱を招きます。 独自に定義された型を作成するのではなく、 Map
を発行しなければならない理由はありますか? 私は個人的に常に小さな結果クラスを作成し(コンストラクター/フィールド/プロパティマッパーとバインダーを使用)、常にMap
の使用を避けます。 非常に便利なユースケースはありますか?
こんにちは@ stevenschlansker-私は「開発者の最初の経験」の観点からそれに取り組んでいます。 上記のコードは、あなた自身のv2チュートリアルから抜粋したもので、見事にミニマリストだと思います。 実際、JavaScriptのようなマップが組み込まれているGroovyのようなJVMでホストされている言語を使用すると、型指定されていない結果がより頻繁に表示されます。
@javajosh https://github.com/jdbi/jdbi/pull/925についてどう思いますか?
@ stevenschlansker #928のことですか?
@stevenschlansker間違いなく改善です! しかし、それでもv2よりも冗長です。 :)これは、Mavenなどの冗長性の向上に加えてです。JDBIが、いくつかの優れた機能を備えていたためにv4を採用するのに苦労したJUnitの道を進むのを見たくありませんが、それよりもはるかに複雑でした。 v3とv3は「十分」でした。 「withHandle」構文についても同じように感じます(ただし、ぶら下がっているハンドルをすべて削除するというあなたの本能は理解しています)。
@javajoshより詳細な制御が必要な場合は、まだJdbi.open()
がありますが、安全のためにtry-with-resourcesブロック内で使用することをお勧めします。
v2からv3への移行ドキュメントの作業を開始します。
@javajosh $#$ List<Map<String,Object>>
ResultBearing.list()
に戻る:特にリリースサイクルの後半で、これを追加するのが良い考えかどうかはわかりません。
冗長性に関するあなたの懸念に共感しますが、その冗長性は開発者の意図を明確にする目的を果たします。
handle.createQuery(sql)
.mapToMap()
.list()
読者には次のことよりも明確です。
handle.createQuery(sql)
.list()
それはデリケートなことであり、私はあなたの立場を選ばなければならないことをうらやましくはありません。 JDBIは素晴らしいライブラリであり、冗長性に関する懸念事項を登録できてうれしいです。 この特定のケースで便利な方法を追加することが理にかなっているかどうかはわかりませんが、私はプロジェクトに真剣に関与していないので、私に対するあなたの判断を信頼する傾向があります! 聞いてくれてありがとう!
短い名前でどのように改善されるかについての具体的な例、またはそれを改善する方法のショーケースを思いついた場合は、お知らせください😄
最も参考になるコメント
小さなプロジェクトの移行に関する注意事項:
クラスの名前を変更しました(インポートを削除してIDEに修正させるほど簡単ではありません):
DBI
->Jdbi
IDBI
->Jdbi
DBIException
->JdbiException
Jdbi
のコンストラクターは、create()
ファクトリメソッドに置き換えられました。ResultSetMapper
はRowMapper
に置き換えられ、map
メソッドには行インデックスがなくなりました。ResultSetMapper
という名前のクラスがJdbi 3に存在しますが、それは別の目的を果たします。@Mapper
は@UseRowMapper
に置き換えられます。 $#Jdbi
のregisterMapper()
はregisterRowMapper()
に置き換えられます。@BindIn
は@BindList
に置き換えられ、StringTemplateは不要になりました。デフォルトのJdbiテンプレートでは、山かっこは引用符で囲まれていません。つまり、 [ツール]-> [データベース]-> [ユーザーパターン]でパラメーターパターンを構成した後、IntelliJが構文を理解します。
Query
のデフォルトタイプはMap
ではなくなったため、list()
を直接呼び出すことはできません。list()
を呼び出す前に、mapToMap()
を呼び出します。TransactionStatus
はもう存在しません。TransactionConsumer.useTransaction()
はHandle
$のみを使用するため、$Jdbi
のuseTransaction()
メソッドでこれを使用する場合は、TransactionStatus
引数を削除する必要があります。Handle
。TransactionCallback.inTransaction()
はHandle
$のみを使用するため、Jdbi
のinTransaction()
メソッドでこれを使用する場合は、TransactionStatus
引数を削除する必要があります。Handle
。CallbackFailedException
はもう存在しません。HandleConsumer
、HandleCallback
、TransactionalConsumer
、TransactionalCallback
などのさまざまな機能インターフェイスは、任意の例外タイプをスローできるようになりました(ただし、不必要なチェックを避けるためにジェネリックを使用して制限されています例外処理)。SQLオブジェクトのサポートは、デフォルトでは使用できなくなりました。 作成された
Jdbi
インスタンスごとに登録する必要があります。IntelliJのMigrateRefactorは、移行を開始するのに役立ちました。