JDBC查看数据表结构

在JDBC连接Oracle数据库成功之后,怎么取得数据库配置信息及数据库表和字段的相关信息?本文做一简单介绍。
以下是连接数据库的例子
ConnectionDB cdb = new ConnectionDB();//新建数据库连接对象
DatabaseMetaData meta = cdb.createConnection().getMetaData();//取得数据库连接元数据。
首先通过“SELECT TABLE_NAME FROM USER_TABLES”SQL语句可以取得数据库下的所有用户表(一般是取用户表,也可取系统表)。
取得的用户表信息存放到ResultSet(rs)中,顺便指出ResultSet的使用在一个循环结束后最后关闭,否则容易产生内存溢出异常。取得所有用户
表之后就可以对每个表进行详细信息的查看及表字段属性的查看,也可查看表与表之间的对应关系。下面列出各种属性及方法:
一:取得数据库相关信息
meta.getURL();//返回与这个数据库的连结的URL
meta.getUserName(); //返回与这个数据库的连结的用户
meta.isReadOnly();//数据库是否为只读
meta.getDatabaseProduceName();//数据库产品名称
meta.getDatabaseProduceVersion();//数据库产品版本,返回字符串
meta.getDatabaseProduceVersion();//版本号
meta.getDriverName();//驱动程序
meta.getDriverVersion();//驱动程序版本
meta.supportsResultSetType(ResultSet.resultype);判定是否支持这种结果集的类型,比如参数如果是Result.TYPE_FORWORD_ONLY是判定是否支持只能先前移动结果集的指针,返回值为boolean,true表示支持
二;取得数据表及字段相关信息
rs.getMetaData().getColumnCount();//取得指定数据表的字段总数,返回值为Int型
rs.getMetaData().getColumnName(n);//取得第n个字段的名称,返回值为String型
rs.getMetaData().getColumnLabel(n);//返回n所对应的列的显示标题
rs.getMetaData().getColumnDisplaySize(n);//缺的第n个字段的长度,返回值为Int型
rs.getMetaData().getColumnTypeName(n);//返回第n个字段的数据类型
rs.getMetaData().isReadOnly(n);//返回该n所对应的列是否只读.
rs.getMetaData().isNullable(n)返回该n所对应的列是否可以为空.
Rs.getMetaData().getSchemaName(n)n列的模式
Rs.getMetaData().getPrecision(n);取得第n列字段类型长度的精确度
Rs.getMetaDta().getScale(n);第n列小数点后的位数
Rs.getMetaData().isAutoIncrement(n);第n列是否为自动递增
Rs.getMetaData().isCurrency(n);是否为货币类型
Rs.getMetaData().isSearchable(n);n列能否出现在where语句中.
三:取得关键字段相关信息
1:主键信息
Meta.getPrimaryKeys(String catalog, String schema, String table);取得表table的主键信息,并以ResultSet形式返回。Catalog:要获得表所在的编目,null表示所有编目。Schema:要获得表所在的模式,null表示所有模式,table:指定的表名称。
primaryKey.getString(int n);主键相关信息。1:null(不知什么意思,有待详查)2:该字段所在数据库名称。3:主键所在表名称。4:主键名称。

2:外键信息
Meta.getImportedKeys(null,null,tableName);取得外键信息,以ResultSet形式返回。
importKey.getString(int n);2,3,4,和上面一样。7:该外键所对应的外键表。8:该外键名称。(仅列出较常用到部分)
3:与该表相关的其他表的外键信息
Meta.getExportedKeys(null,null,tableName);取得与该表相关的其他表的外键信息。
具体代码实例:
//查看用户表结构

  public ActionForward queryTable(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'queryTable' method");
        }
        List lists = new ArrayList();//字段列表(包含每个字段的部分属性)
        List list = new ArrayList();//表名列表
//        Map nList = new HashMap();//1:n映射关系集合
        List nList = new ArrayList();//1:n映射关系集合
        ConnectionDB cdb = new ConnectionDB();//数据库连接对象

        AaSysYyxxActionForm aForm = (AaSysYyxxActionForm)form;
        String tableName = aForm.getTableName();//取得表名称
        String sql = "SELECT * FROM " + tableName;
        DatabaseMetaData meta = cdb.createConnection().getMetaData();

        //取得1:n映射关系,collections
        ResultSet exportKey = meta.getExportedKeys(null, null, tableName);
        int mapKey = 1;
        while(exportKey.next()) {
            AaSysYyxxActionForm asyForm = new AaSysYyxxActionForm();
            asyForm.setCollectionName(exportKey.getString(7));
            nList.add(asyForm);
  //            nList.put(exportKey.getString(7), exportKey.getString(7));
               mapKey++;
         }

        ResultSet primaryKey = meta.getPrimaryKeys(null, null, tableName);//得到主键集合
        primaryKey.next();
        ResultSet result = cdb.queryDB(sql);//查询结果集
        ResultSet rs = cdb.queryDB("SELECT TABLE_NAME FROM USER_TABLES");//查询到的表名结果集
        while(rs.next()) {
            list.add(rs.getString("TABLE_NAME"));
        }
        for(int i=1; i<=result.getMetaData().getColumnCount(); i++){//字段总数
            AaSysYyxxActionForm forms = new AaSysYyxxActionForm();
            if(result.getMetaData().getColumnName(i).equals(primaryKey.getString(4))) {//判断是否为主键 3:表名 4:主键名
                forms.setIsPkey("是");
            }else {
                forms.setIsPkey("否");
            }
            ResultSet importKey = meta.getImportedKeys(null, null, tableName);//得到外键集合
            while(importKey.next()) {
                if(result.getMetaData().getColumnName(i).equals(importKey.getString(8))) {//判断是否为外键
                    forms.setIsIkey("是");
                    forms.setImportTable(importKey.getString(3));//设置外键表
                    break;
                }else {
                    forms.setIsIkey("否");
                }
            }
            forms.setFieldName(result.getMetaData().getColumnName(i));//字段名
            forms.setFieldSize(result.getMetaData().getColumnDisplaySize(i));//字段长度
            forms.setTypeName(result.getMetaData().getColumnTypeName(i));//字段类型名
            lists.add(forms);
        }

        cdb.closeStatement();//关闭Statement
        cdb.closeConnection();//关闭Connection
        request.setAttribute("lists", lists);//所选表字段列表
        request.setAttribute("list", list);//所有表名列表,用于填充下拉列表
        request.setAttribute("nList", nList);
        return mapping.findForward("queryTable");
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值