0

私の現在のプロジェクトでは、異なるデータベース間のデータ型の異質性を抽象化する必要があります。

たとえば、MySQLデータベースにテーブルがあります。テーブル名はFIRSTTABLE(badgeID *Integer* , pref INT)です。

Apache-Derbyデータベースにテーブルがあります。テーブル名はFIRSTTABLE (badgeID *varchar(12)*, pref INT)です。

現在、MySQLデータベースとApache Derbyデータベースを同時にクエリするクエリコンポーネントのbadgeIDは、「double」です。

私の要件は、クエリコンポーネントが基盤となるデータベース(MySQLまたはApache Derby)を認識してはならないということです。そのクエリは、データベースのタイプに依存しない必要があります。

この問題を解決するにはどうすればよいですか?私の研究課題はMySQLやApach-Derbyに限定されていません。わかりやすくするために、Apache-DerbyとMySQLの例を取り上げました。

4

1 に答える 1

1

アダプターを作成する必要があります。アダプタは、1つのJavaクラスまたは複数のJavaクラスである可能性があります。

あなたの例に基づくと、次のようになります。

public class DatabaseAdapter {

    private DatabaseType type;

    public DatabaseAdapter(DatabaseType type) {
        this.type = type;
    }

    public ResultSet selectFirstTable(double badgeID) {
        if (type == DatabaseType.Derby) {
            String s = Double.toString(badgeID);
            return derbySelectFirstTable(s);
        } else if (type == DatabaseType.MySQL) {
            int i = (int) badgeID;
            return mysqlSelectFirstTable(i);
        } else {
            return null;
        }
    }

}

public enum DatabaseType {
    MySQL, Derby
}

これをコーディングするもう1つのより良い方法は、インターフェースを使用することです。繰り返しますが、あなたの例を使用すると、コードは次のようになります。

public interface Database {
    public ResultSet selectFirstTable(double badgeID);
}

public class MySQLDatabase implements Database {

    public ResultSet selectFirstTable(double badgeID) {
         int i = (int) badgeID;
         // code to select first table in MySQL
    }

}

public class DerbyDatabase implements Database {

    public ResultSet selectFirstTable(double badgeID) {
        String s = Double.toString(badgeID);
        // code to select first table in Derby
    }

}

コードのどこかで、データベースインターフェイスを正しいデータベースタイプで初期化します。

Database database = null;
if (type == DatabaseType.MySQL) {
    database = new MySQLDatabase();
} else if (type == DatabaseType.Derby) {
    database = new DerbyDatabase();
}
于 2012-10-11T19:35:27.793 に答える