2012-10-11 74 views
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的例子。

回答

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 
} 

另一種更好的編碼方式是使用接口。再次,使用你的例子,代碼看起來像這樣。

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(); 
}