日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键

發(fā)布時(shí)間:2023/12/10 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章轉(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。