现在在做数据库信息的提取工作。主要是这个类DatabaseMetaData。
文档中对getSchemas()函数的解释是:
检索可在此数据库中使用的模式名称。可根据模式名称对结果进行排序。 
模式列为: TABLE_SCHEM String => 模式名称 
TABLE_CATALOG String => 类别名称(可为 null) 返回:
ResultSet 对象,在该对象中,每一行都是一个模式描述 
抛出: 
SQLException - 如果发生数据库访问错误我 的问题是:
1.这里说的模式指的是什么?
我的理解是你的database server中的database,也就是create database dbName;这样的sql语句建立的所有database。
但是,自己写的一些代码的执行效果和理解不符合。
public void testGetSchemas() {
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306","root","root");
            DatabaseMetaData meta = con.getMetaData();
            ResultSet res = meta.getSchemas();
            System.out.println("List of schemas: ");
            while (res.next()) {
                System.out.println("   " + res.getString("TABLE_SCHEM") + ", "
                        + res.getString("TABLE_CATALOG"));
            }
            res.close();            con.close();
        } catch (java.lang.ClassNotFoundException e) {
            System.err.println("ClassNotFoundException: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("SQLException: " + e.getMessage());
        }
        System.out.println("endl`~~!");
    }
输出为空,我的server里有好几个database的.
把链接的url改为 jdbc:mysql://localhost:3306/sampledb,
sampledb是server中的一个database,里面有3张表,输出还是为空,但这个时候去执行meta.getTables();还是可以得到这三张表的名字的。所以,很迷惑,不知这个schema是什么东西。
望指教,谢谢~~!

解决方案 »

  1.   

    A schema is a collection of database objects (used by a user.). 
    Schema objects are the logical structures that directly refer to the database’s data.
    A user is a name defined in the database that can connect to and access objects.
    Schemas and users help database administrators manage database security.从定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(Oracle中虽然有create schema语句,但是它并不是用来创建一个schema的),在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省shcema。即schema的个数同user的个数相同,而且schema名字同user名字一一 对应并且相同,所有我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。一个用户有一个缺省的schema,其schema名就等于用户名,当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。