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);取得与该表相关的其他表的外键信息。
具体代码实例:
//查看用户表结构
以下是连接数据库的例子
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"); }
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页