在我当前的项目中,我需要抽象不同数据库之间的数据类型异构性。
例如,我在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为例。
发布于 2012-10-12 03:35:28
您必须编写一个适配器。适配器可以是一个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 database = null;
if (type == DatabaseType.MySQL) {
database = new MySQLDatabase();
} else if (type == DatabaseType.Derby) {
database = new DerbyDatabase();
}https://stackoverflow.com/questions/12845128
复制相似问题