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");
}
相關推薦
JDBC檢視資料表結構
在JDBC連線Oracle資料庫成功之後,怎麼取得資料庫配置資訊及資料庫表和欄位的相關資訊?本文做一簡單介紹。 以下是連線資料庫的例子 ConnectionDB cdb = new ConnectionDB();//新建資料庫連線物件
MySQL 檢視資料表結構以及詳情的方法
一、 查看錶結構 下面三個是我們最常用的檢視資料表結構的語句: desc tabledescribe tableshow columns from tbale如果你在控制檯一次輸入,就會發現這三個語句所列印的結果是一樣的。 比如我在本地study_test_db數控中嘗
MySQL——檢視資料表結構
1. 查看錶的基本結構語句 DESCRIBE用 DESCRIBE/DESC 語句可以查看錶的欄位資訊,其中包括欄位名、欄位資料型別、是否為主鍵、是否有預設值等。語法規則如下:DESCRIBE 表明;或者簡寫為:DESC 表明; 【例】 分別使用 D
iOS -轉載-使用Navicat檢視資料表的ER關係圖
Navicat軟體真是一個好東西。今天需要分析一個數據庫,然後想看看各個表之間的關係,所以需要查看錶與表之間的關係圖,專業術語叫做ER關係圖。 預設情況下,Navicat顯示的介面是這樣的: &
深度剖析Zabbix Web scenarios資料表結構
深度剖析Zabbix Web scenarios資料表結構 前言 因開發需求,需要解析Zabbix web監控資料表結構;因為網上關於Zabbix資料表結構解析的比較少,所以心血來潮寫了一篇作為記錄。 突破口 對Zabbix資料庫表結構做解析的時候,我有個習慣,直接針對某個itemid懟。
Navicat工具匯出Mysql資料表結構到Excel檔案中
------------------------------------------------------------------------ 前言 專案中資料庫設計已經完成,現在到了程式碼實現的階段,資料庫中沒有資料,測試看不出效果,領導要求添點資料,單個
Mysql資料庫如何檢視資料表table被哪些儲存過程procedure使用過
一、摘要 由於程式碼重構,修改了多張表結構,java後臺程式碼做相應修改處理,開發人員內測沒問題提交業務部門測試時發現,新客戶取不到產品價格,原因是儲存過程呼叫的還是就的資料表。為此,需要先找出哪些儲存過程使用到了這些表,然後修改。那麼問題來了,mysql資料庫
Informix資料表結構分析資料整理之欄位型別說明和查詢SQL語句
查詢所有Informix資料表字段型別SQL語句: select a.tabname,b.colname,b.coltype,case b.coltype when '0' then 'CHAR' when '1' then 'SMALLINT' when '2' the
檢視mysql表結構和表建立語句的方法
檢視mysql表結構的方法有三種: 1、desc tablename; 例如: 要檢視jos_modules表結構的命令: desc jos_modules; 檢視結果: mysql> desc jos_modules; +------------------+---
利用navicat匯出資料表結構和insert語句
用了navicat一段時間了,發現navicat確實非常方便,可支援多種資料庫。以前一直覺得他的到處sql檔案比較麻煩,每個表都會生成一個sql檔案,不方便進行匯入操作。今天突然發現它也有批量到出成一個sql檔案的功能。 操作步驟 選單 : 資料傳輸 目標選擇,然後進
phpmyadmin資料表結構沒有顯示註釋列
新開的一個專案,用phpmyadmin作為圖形化操作資料庫工具。建立資料表時為其每列新增好註釋,瀏覽資料表內容有顯示註釋內容,但是檢視資料表結構沒有顯示註釋列,不方便直觀檢視資料表每列的意思。 上網搜尋並沒有發現解決方法,對比有註釋列的資料庫伺服器,猜測可能是因為phpmyadmin版本(小於4.7)造
檢視mysql表結構的指令
來源自我的部落格 desc 表名; show columns from 表名; describe 表名; show create table 表名; use information_schema
MYSQL不同主機下資料表結構轉移
問題:現將 192.168.200.XXX MySQL資料庫A中表結構完全複製至127.0.0.1 MySQL資料庫B 處理方式1: 1、匯出資料庫A中表結構為sql檔案,語句為: mysqldump
使用navicat for mysql匯出資料表結構及表資料
方法:1、選中需要匯出的表結構的資料庫,點選“工具”–>資料傳輸(或者直接右鍵選擇資料傳輸)。 2、在彈出的窗口裡左邊可以選擇需要匯出的表,右邊選擇連線或檔案(我要匯出sql檔案,所以我選的是檔
無限層級mysql資料表結構
# 無限層級mysql資料表結構 # 建立表 -- auto-generated definition create table target_resource ( id int not null primary key, resource_i
Oracle查詢資料表結構SQL
select A.column_name ,A.data_type ,A.data_length ,A.data_precision , A.Data_Scale ,A.nullable ,A.Data_default ,B.comments
Oracle查詢資料表結構/欄位/型別/大小
Oracle資料庫字典在Oracle的絕大多數資料字典檢視中都有象DBA_TABLES,ALL_TABLES和USER_TABLES這樣的檢視家族。Oracle中有超過100個檢視家族,下表列出了最重要和最常用的檢視家族,需要注意的是每個檢視家族都有一個DBA_,一個ALL_
jdbc獲取資料表表結構
做製作開發平臺時,首要的一點是如何取得資料庫表結構資訊。一般通用的做法就是通過JDBC中的ResultSetMetaData類來進行操作,當你取得了資料庫表結構資訊後,比如說表的每個欄位名稱,欄位型別等。 首先取得資料庫連線後取得DatabaseMetaData。 Da
phpcms v9 資料表結構
表 1 : v9_admin 管理員表 欄位 型別 Null 預設 額外 註釋 userid mediumint(6) unsigned PK auto_increment 使用者id usernam
mysql千萬級資料表結構修改
當需要對錶進行ddl操作如加索引、增刪列時,資料量小時直接線上修改表結構影響不大 當表達到百萬、千萬資料就不能直接線上修改表結構 下面是具體的過程: 1、備份資料 select * from ih_order into outfile '/bak/order.txt'; m