Java 不同数据库数据类型异构性的抽象

Java 不同数据库数据类型异构性的抽象,java,database,wsdl,Java,Database,Wsdl,在我当前的项目中,我需要抽象不同数据库之间的数据类型异构性 例如,我在MySQL数据库中有一个表。表名为FIRSTTABLE(badgeID*Integer*,pref INT) 我在ApacheDerby数据库中有一个表。表名为FIRSTTABLE(badgeID*varchar(12)*,pref INT) 现在,同时查询MySQL数据库和ApacheDerby数据库的查询组件的badgeID为“double” 我的要求是查询组件不应该知道底层数据库(MySQL或ApacheDerby)。它

在我当前的项目中,我需要抽象不同数据库之间的数据类型异构性

例如,我在MySQL数据库中有一个表。表名为
FIRSTTABLE(badgeID*Integer*,pref INT)

我在ApacheDerby数据库中有一个表。表名为
FIRSTTABLE(badgeID*varchar(12)*,pref INT)

现在,同时查询MySQL数据库和ApacheDerby数据库的查询组件的badgeID为“double”

我的要求是查询组件不应该知道底层数据库(MySQL或ApacheDerby)。它的查询应该独立于数据库的类型


我如何解决这个问题?我的研究问题不仅限于MySQL或ApachDerby。为了清楚起见,我举了一个ApacheDerby和MySQL的例子。

您必须编写一个适配器。适配器可以是一个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
    }

}
另一种更好的编码方法是使用接口。同样,使用您的示例,代码看起来是这样的

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