您的位置:首页 > 数据库 > Oracle

JDBC查看数据表结构

2016-08-01 20:12 316 查看
在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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle jdbc