Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在运行时从DatabaseMetaData匹配表名和别名?_Java_Jdbc_Database Metadata - Fatal编程技术网

Java 是否在运行时从DatabaseMetaData匹配表名和别名?

Java 是否在运行时从DatabaseMetaData匹配表名和别名?,java,jdbc,database-metadata,Java,Jdbc,Database Metadata,我知道如何使用.getTables()获取表和别名条目 final ResultSet rs = dmd.getTables(null, "MySchema", "%", new String[]{"TABLE","ALIAS"}); 我需要能够确定的是哪个别名与哪个表名称相匹配 我特别需要能够在Oracle、sqlserver和DB2上执行此操作 如果我有一个表T00001,它有一个别名MyTable,我如何从连接中使用数据库元数据来匹配这两个表呢,我非常确定,在使用库存Oracle JDB

我知道如何使用
.getTables()
获取
别名
条目

final ResultSet rs = dmd.getTables(null, "MySchema", "%", new String[]{"TABLE","ALIAS"});
我需要能够确定的是哪个
别名
与哪个
名称相匹配

我特别需要能够在
Oracle
sqlserver
DB2
上执行此操作


如果我有一个表
T00001
,它有一个别名
MyTable
,我如何从
连接中使用
数据库元数据来匹配这两个表呢,我非常确定,在使用库存Oracle JDBC驱动程序时,无法直接通过检索这些信息。DB2或SQL Server可能有特定于驱动程序的方法,因为我没有彻底检查它们。作为欺骗,您可以从DatabaseMetaData对象中
getConnection()
,运行特定于数据库的查询以检索所需的信息,如下所示:

public class TableAliasMapperJdbc {
    public Map<String, List<String>> mapTableAliases(String url, String user, String password, String sql) throws SQLException {
        try (
            Connection conn = DriverManager.getConnection(url, user, password);
            // we use conn.getMetaData().getConnection() instead of conn here only to fit within the parameters of the question
            PreparedStatement stmt = conn.getMetaData().getConnection().prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
        ) {
            // this may not do what you want if you have synonyms of synonyms
            Map<String, List<String>> tableAliases = new HashMap<>();
            while (rs.next()) {
                String table = rs.getString(1);
                String alias = rs.getString(2);
                List<String> aliases = tableAliases.get(table);
                if (aliases == null) {
                    tableAliases.put(table, aliases = new ArrayList<>(2));
                }
                aliases.add(alias);
            }
            return tableAliases;
        }
    }

    public void print(String dbName, Map<String, List<String>> tableAliases) {
        System.out.format("\nThe following are the table aliases for %s:\n", dbName);
        for (Map.Entry<String, List<String>> entry : tableAliases.entrySet()) {
            System.out.format("The alias(es) for %s are: %s.\n", entry.getKey(), String.join(", ", entry.getValue()));
        }
    }

    public static void main(String[] args) throws SQLException {
        TableAliasMapperJdbc mapper = new TableAliasMapperJdbc();
        mapper.print("Oracle",
            mapper.mapTableAliases(
                "jdbc:oracle:thin:@localhost:1521:xe",
                "scott",
                "tiger",
                "SELECT table_name, synonym_name FROM user_synonyms")); // or maybe all_synonyms

        mapper.print("DB2",
            mapper.mapTableAliases(
                "jdbc:db2://localhost:50000/SAMPLE",
                "db2admin",
                "db2admin",
                "SELECT base_tabname, tabname FROM syscat.tables WHERE type = 'A' AND owner = 'DB2ADMIN'"));

        mapper.print("SQL Server",
            mapper.mapTableAliases(
                "jdbc:sqlserver://localhost:1433",
                "sa",
                "Password123",
                "SELECT PARSENAME(base_object_name,1), name FROM sys.synonyms"));
    }
}
公共类TableAliasMapperJdbc{
公共映射表别名(字符串url、字符串用户、字符串密码、字符串sql)引发SQLException{
试一试(
Connection conn=DriverManager.getConnection(url、用户、密码);
//我们在这里使用conn.getMetaData().getConnection()而不是conn,只是为了适应问题的参数
PreparedStatement stmt=conn.getMetaData().getConnection().prepareStatement(sql);
ResultSet rs=stmt.executeQuery();
) {
//如果您有同义词的同义词,这可能不会达到您想要的效果
Map TableAlias=新HashMap();
while(rs.next()){
字符串表=rs.getString(1);
字符串别名=rs.getString(2);
列表别名=TableAlias.get(表格);
如果(别名==null){
tableAlias.put(table,alias=newarraylist(2));
}
别名。添加(别名);
}
返回表别名;
}
}
public void打印(字符串dbName、映射表别名){
System.out.format(“\n以下是%s的表别名:\n”,dbName);
对于(Map.Entry:TableAlias.entrySet()){
System.out.format(“%s的别名是:%s。\n”、entry.getKey()、String.join(“,”、entry.getValue());
}
}
公共静态void main(字符串[]args)引发SQLException{
TableAliasMapperJdbc映射器=新的TableAliasMapperJdbc();
mapper.print(“Oracle”,
mapper.MapTableAlias(
“jdbc:oracle:thin:@localhost:1521:xe”,
“斯科特”,
“老虎”,
“选择表名、同义词(来自用户的同义词”);//或者选择所有同义词。”
print(“DB2”,
mapper.MapTableAlias(
“jdbc:db2://localhost:50000/SAMPLE”,
“db2admin”,
“db2admin”,
“从syscat.tables中选择base_tabname,tabname,其中type='A'和owner='DB2ADMIN'”);
print(“SQL Server”,
mapper.MapTableAlias(
“jdbc:sqlserver://localhost:1433",
“sa”,
“密码123”,
“选择PARSENAME(base_object_name,1),name FROM sys.synonyms”);
}
}
代码使用JDK 1.8.045、Oracle XE 11.2.0.2.0及其绑定的JDBC驱动程序、DB2 Express-C 10050500及其绑定的JDBC驱动程序以及SQL Server 2014 Express 12.0.2000.8和Microsoft JDBC驱动程序4.1.5605.100进行了成功测试

基于SQL Server的查询。

我认为用普通的JDBC方法是不可能的。您是否有可能将其限制为特定的DBMS产品?在这里,您通常有更多的选项来查看数据库模式,您在谈论哪个数据库?恐怕这不能在纯JDBC中完成。