java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键
文章轉(zhuǎn)自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/
在某項(xiàng)目中用到了 hibernate ,大家都知道 hibernate 是 ORM 框架,他是有能力根據(jù)實(shí)體生成數(shù)據(jù)庫(kù)表的。我們?cè)趩卧獪y(cè)試的時(shí)候用到了 dbUnit ,dbUnit 可以幫助我們?cè)跍y(cè)試前把數(shù)據(jù)庫(kù)的測(cè)試數(shù)據(jù)準(zhǔn)備好,然后我們就利用現(xiàn)成的數(shù)據(jù)庫(kù)環(huán)境測(cè)試,測(cè)試完成后需將數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)清除(為了不影響其他的單元測(cè)試),然后接著下一個(gè)測(cè)試。雖然已經(jīng)有快一年多沒(méi)更新了,dbUnit 整體使用還是不錯(cuò)的,但在清除數(shù)據(jù)的時(shí)候dbUnit 就似乎有些力不從心了。當(dāng)表有自關(guān)聯(lián)(表中有外鍵引用自己)的時(shí)候就有問(wèn)題了,因?yàn)橥怄I約束,數(shù)據(jù)總是不能清除。
dbUnit 不給力,那咱們自己可就要給力啊。學(xué)過(guò) java 的人,應(yīng)該也都學(xué)過(guò) jdbc,jdbc 不僅可以操作數(shù)據(jù)庫(kù),還可以獲取數(shù)據(jù)庫(kù)中的 元(meta)信息,比如數(shù)據(jù)庫(kù)中有哪些表,表中有哪些列等等。
我們要使用的核心類是 java.sql.DatabaseMetaData ,可以通過(guò) java.sql.Connection#getMetaData() 來(lái)獲得。
Java代碼??
Connection?conn?=?...;
DatabaseMetaData?dbMetaData?=?conn.getMetaData();
獲取所有表
Java代碼??
String?catalog?=?conn.getCatalog();?//catalog?其實(shí)也就是數(shù)據(jù)庫(kù)名
ResultSet?tablesResultSet?=?dbMetaData.getTables(catalog,null,null,new?String[]{"TABLE"});
while(tablesResultSet.next()){
String?tableName?=?tablesResultSet.getString("TABLE_NAME");
}
tablesResultSet 中有以下列:
TABLE_CAT String => 表類別(可為 null)
TABLE_SCHEM String => 表模式(可為 null)
TABLE_NAME String => 表名稱
TABLE_TYPE String => 表類型。典型的類型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。
REMARKS String => 表的解釋性注釋
TYPE_CAT String => 類型的類別(可為 null)
TYPE_SCHEM String => 類型模式(可為 null)
TYPE_NAME String => 類型名稱(可為 null)
SELF_REFERENCING_COL_NAME String => 有類型表的指定 "identifier" 列的名稱(可為 null)
REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中創(chuàng)建值的方式。這些值為 "SYSTEM"、"USER" 和 "DERIVED"。(可能為 null)
獲取某個(gè)表的主鍵
Java代碼??
String?tableName?=?...;
ResultSet?primaryKeyResultSet?=?dbMetaData.getPrimaryKeys(catalog,null,tableName);
while(primaryKeyResultSet.next()){
String?primaryKeyColumnName?=?primaryKeyResultSet.getString("COLUMN_NAME");
}
primayKeyResultSet 有以下幾列:
TABLE_CAT String => 表類別(可為 null)
TABLE_SCHEM String => 表模式(可為 null)
TABLE_NAME String => 表名稱
COLUMN_NAME String => 列名稱
KEY_SEQ short => 主鍵中的序列號(hào)(值 1 表示主鍵中的第一列,值 2 表示主鍵中的第二列)。
PK_NAME String => 主鍵的名稱(可為 null)
獲取某個(gè)表的外鍵
Java代碼??
ResultSet?foreignKeyResultSet?=?dbMetaData.getImportedKeys(catalog,null,tableName);
while(foreignKeyResultSet.next()){
String?fkColumnName?=?foreignKeyResultSet.getString("FKCOLUMN_NAM");
String?pkTablenName?=?foreignKeyResultSet.getString("PKTABLE_NAME");
String?pkColumnName?=?foreignKeyResultSet.getString("PKCOLUMN_NAME");
}
foreignKeyResultSet 有以下幾列:
PKTABLE_CAT String => 被導(dǎo)入的主鍵表類別(可為 null)
PKTABLE_SCHEM String => 被導(dǎo)入的主鍵表模式(可為 null)
PKTABLE_NAME String => 被導(dǎo)入的主鍵表名稱
PKCOLUMN_NAME String => 被導(dǎo)入的主鍵列名稱
FKTABLE_CAT String => 外鍵表類別(可為 null)
FKTABLE_SCHEM String => 外鍵表模式(可為 null)
FKTABLE_NAME String => 外鍵表名稱
FKCOLUMN_NAME String => 外鍵列名稱
KEY_SEQ short => 外鍵中的序列號(hào)(值 1 表示外鍵中的第一列,值 2 表示外鍵中的第二列)
UPDATE_RULE short => 更新主鍵時(shí)外鍵發(fā)生的變化
DELETE_RULE short => 刪除主鍵時(shí)外鍵發(fā)生的變化
PK_NAME String => 主鍵的名稱(可為 null)
FK_NAME String => 外鍵的名稱(可為 null)
DEFERRABILITY short => 是否可以將對(duì)外鍵約束的評(píng)估延遲到提交時(shí)間
關(guān)鍵的技術(shù)問(wèn)題已經(jīng)解決,接下來(lái)就該具體實(shí)施了。刪除數(shù)據(jù)庫(kù)中沒(méi)有所以表中的數(shù)據(jù),我想了一個(gè)簡(jiǎn)單粗暴的方法,就是0.先把所有表中的外鍵刪除 1.刪除表中的所有數(shù)據(jù) 2.把外鍵再加回去。
總結(jié)
以上是生活随笔為你收集整理的java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WPF中打印问题的探讨[转]
- 下一篇: java怎么复制别人的数据库_java-