0

コードを一部の JDBC ドライバー (MySql など) と密結合させたくありません。多くのデータベース実装で動作するユニバーサル コードを作成したいと考えています。そして、JDBC を使用するときにこの目標を達成する方法がよくわかりません。

これを達成するには、ドライバー クラス名 (および接続文字列) を.propertiesファイル (たとえば"com.mysql.jdbc.Driver") にエクスポートし、コードで次のように使用するだけでよいと思いますClass.forName(PROPERTIES.getDriverName()).newInstance();。したがって、データベースを変更することにした場合、変更する必要があるのは jdbc だけです。ファイル内のドライバー名.properties(たとえば to "COM.ibm.db2.jdbc.app.DB2Driver")、接続文字列、および.jarクラスパス内のドライバーのファイルを変更します。

そうですか?

4

4 に答える 4

3

疎結合はいくつかの方法で実現でき

ます

。 - 通常、何らかの抽象化

C を提供します。コードが Java EE コードの場合、DataSource を操作して、Java アプリケーション サーバー上で構成できます。名前でデータ ソースを検索しますが、実装の詳細はわかりません。 Dの背後に

あります。レイヤーでアプリケーションを構築することを確認できます-ビジネスロジックレイヤーは、データエンジンを使用するデータアクセスレイヤーを使用します(実装を簡単に変更できるように、データエンジンクラスがインターフェイスを実装していることを確認してください)。

データ エンジン クラスは、構成 (XML ファイルのプロパティ) から jdbc ドライバーに関する情報を読み取ることができます。たとえば、これは基本的に Hibernate が行うことです。

于 2012-06-23T17:30:39.510 に答える
2

あなたはそれを正しく理解しました。ドライバー クラス名、データベース URL、ユーザーとパスワードを外部化します。とにかく、ほとんどの「フレームワーク」で行われていること: Java EE サーバーでは、サーバーでデータソースを構成し、JNDI を使用してデータソースにアクセスできます。Hibernate の構成ファイルには、このためのエントリがあり、接続プールは通常、XML またはプロパティ ファイルを使用して構成を保持します。

もちろん、独自の SQL コードを使用する場合、あるデータベースから別のデータベースに簡単に切り替えることはできませんが、それは別の問題です。

于 2012-06-23T17:34:44.850 に答える
1

接続文字列を外部化しても、アプリケーションはさまざまなデータベースを処理できません。しかし、ここでできることがあります。

接続の代わりにデータソースを使用するこれにより、接続プールなどから JNDI を使用してさまざまな方法で接続を作成することができます。

javax.sql.DataSource javadoc から直接引用した Datasource の詳細

この DataSource オブジェクトが表す物理データ ソースへの接続のファクトリ。DriverManager 機能の代替である DataSource オブジェクトは、接続を取得するための推奨される手段です。

データにアクセスするためのDAO インターフェイスを定義します。アプリケーション コードを Interface に依存させます。DAO インターフェイスにデータベース固有の実装を提供できます。データベースが変更されたら、データベースの新しい実装を作成します。データベースに応じて、DAOファクトリにDAOの適切なインスタンスを選択させます。

ORMパラダイムをサポートする Mybatis や Hibernate などのライブラリは、これらの手順を自動化します。

于 2012-06-23T18:00:40.553 に答える
1

これは確かにうまくいくかもしれません。ただし、質問の将来の読者のために、もう少し完全になります。

しかし、作成するクエリの多くは、データベース固有のものであったり、効果を発揮するために特定のキーワードに依存している場合があります。たとえば、一般的なクエリを考えてみましょう。データベース内のすべての製品を一覧表示する必要がありますが、一度に 10 個のユーザーを表示します。

MySQL:

select * from products LIMIT 0,10

次に、次の 10 行について:

select * from products LIMIT 10,10

素晴らしいので、ユーザーはデータベースに MySQL を使用できます。別の無料で非常に人気のあるデータベースである postgres を使用している場合はどうでしょうか。そのクエリは機能しません。

SELECT * FROM product LIMIT 10 OFFSET 10

したがって、あなたのコードはあなたが思っているほど移植性がありません。

これを回避する 1 つの方法は、実行する予定のすべてのクエリ/アクセス用に独自のインターフェイス (インターフェイス Query、インターフェイス Access) を作成し、DB 方言 (MySQL、postgres) に基づいてインスタンス化できるクエリ ファクトリを用意することです。など)、MySQLQueryImpl と PostGresQueryImpl を作成します (どちらも Query インターフェースを実装しています)。

残念ながら、データベース呼び出しの一部を 2 回コーディングするか、それらをプロパティ ファイル自体に移動する必要があります。プロパティ ファイルからインスタンス化するようにクエリ要素を設計することもできます (最初に希望したように)。将来、他のユーザーが独自のクエリを実装できるようにすることで、拡張性があり、自分ですべてを行う必要はありません。

または...

もう 1 つの選択肢は、おそらくより洗練されていてエラーが起きにくい (まあ... たぶん) 他の人に任せることです。Hibernateは、データベースの読み取り/書き込みを抽象化する非常に一般的なツールであり、必要に応じて別のデータベースを使用するように構成できますが、長年の経験とバグ修正があるだけです。(複雑なクエリや結合など) 習得するのが最も簡単なことではありませんが、基本的なモデルとデータベースへのマッピングについては、キャッシュを非常に簡単にオン/オフする機能を含め、必要なものすべてとそれ以上のものを提供します。このようなシステムを作成して強化するには、長い時間がかかります。

于 2012-06-23T17:32:12.337 に答える