JavaのデータベースからUDTを読む最良の方法は何ですか?
-
11-10-2019 - |
質問
誰かが上になるまで、UDTSとJDBCについてのすべてを知っていると思いました それで Javadocのいくつかの詳細を指摘しました java.sql.sqlinput と java.sql.sqldata 私にジャバドック。そのヒントの本質は(sqlinputから)でした:
SQL構造化されたタイプまたはSQL個別のタイプのインスタンスを表す値のストリームを含む入力ストリーム。このインターフェイスは、カスタムマッピングにのみ使用され、舞台裏のドライバーが使用しており、プログラマーがSQLinputメソッドを直接呼び出すことはありません。
これは、私が慣れていることのまったく反対です(Oracle JDBCドライバーと一緒に使用すると、生産システムでも使用され、安定しています):実装 SQLData
この実装をカスタムマッピングで提供します
ResultSet.getObject(int index, Map mapping)
JDBCドライバーは、
SQLData.readSQL(SQLInput stream, String typeName)
方法。私はこの方法を実装し、から各フィールドを読みます SQLInput
ストリーム。最終的には、 getObject()
私の正しく初期化されたインスタンスを返します SQLData
実装UDTからすべてのデータを保持します。
私にとって、これはこのようなカスタムマッピングを実装するのに最適な方法のようです。このように進む正当な理由:
- ベンダー固有のクラスを使用する代わりに、標準APIを使用できます。
oracle.sql.STRUCT
, 、など - 適切なゲッター/セッターやその他のプロパティを使用して、UDTSからソースコードを生成できます
私の質問:
- 私のアプローチ、実装についてどう思いますか
SQLData
? Javadocがそうでないと述べていても、それは実行可能ですか? - JavaでUDTを読む他のどの方法を知っていますか?たとえば、春は何をしますか?冬眠は何をしますか? JPAは何をしますか?職業はなんですか?
補遺:
UDTのサポートとストアドプロシージャとの統合は、 jooq. 。 JOOQは、基礎となるデータベースアーキテクチャを隠すことなく、クライアントコードからより複雑な「JDBCファクト」を隠すことを目指しています。上記のような同様の質問がある場合、Jooqはあなたに答えを提供するかもしれません。
解決
ドライバーが舞台裏で動作するように設定する利点は、プログラマーが型マップをresultSet.getObject(...)に渡す必要がないため、覚えておくべき詳細が1つないことです(ほとんどの場合)。ドライバーは、プロパティを使用してマッピングを定義するプロパティを使用して実行時に構成することもできます。そのため、アプリケーションコードは、SQLタイプの詳細からオブジェクトマッピングに独立して保持できます。アプリケーションがいくつかの異なるデータベースをサポートできる場合、これにより、各データベースに対して異なるマッピングをサポートできます。
あなたの方法は実行可能であり、その主な特徴は、アプリケーションコードが明示的なタイプマッピングを使用することです。
舞台裏でアプローチすると、resultSet.getObject(int)メソッドは、resultset.getObject(int index、マップマッピング)のアプリケーションコードで渡されるものではなく、接続で定義されたタイプマッピングを使用します。それ以外の場合、アプローチは同じです。
他のアプローチ
これらのクラスに基づいて、JBoss 4で使用されている別のアプローチを見てきました。
org.jboss.ejb.plugins.cmp.jdbc.JDBCParameterSetter
org.jboss.ejb.plugins.cmp.jdbc.JDBCResultSetReader.AbstractResultSetReader
アイデアは同じですが、実装は標準以外です(おそらく、SQLDATA/SQLINPUTを定義するJDBC標準のバージョンを事前に日付にします)。
他のヒント
JavaでUDTを読む他のどの方法を知っていますか?たとえば、春は何をしますか?冬眠は何をしますか? JPAは何をしますか?職業はなんですか?
これに類似したことがHibernate/JPAでどのように行われるかの例は、別の質問に対するこの答えに示されています。
私は春が何をするか知っています:あなたは彼らの実装を書きます rowmapper インターフェース。私は 一度もない スプリングでsqldataを使用しました。あなたの投稿は、私がそのインターフェースについて聞いたり考えたりしたのは初めてでした。