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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/10 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章轉自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/

在某項目中用到了 hibernate ,大家都知道 hibernate 是 ORM 框架,他是有能力根據實體生成數據庫表的。我們在單元測試的時候用到了 dbUnit ,dbUnit 可以幫助我們在測試前把數據庫的測試數據準備好,然后我們就利用現成的數據庫環境測試,測試完成后需將數據庫中的所有數據清除(為了不影響其他的單元測試),然后接著下一個測試。雖然已經有快一年多沒更新了,dbUnit 整體使用還是不錯的,但在清除數據的時候dbUnit 就似乎有些力不從心了。當表有自關聯(表中有外鍵引用自己)的時候就有問題了,因為外鍵約束,數據總是不能清除。

dbUnit 不給力,那咱們自己可就要給力啊。學過 java 的人,應該也都學過 jdbc,jdbc 不僅可以操作數據庫,還可以獲取數據庫中的 元(meta)信息,比如數據庫中有哪些表,表中有哪些列等等。

我們要使用的核心類是 java.sql.DatabaseMetaData ,可以通過 java.sql.Connection#getMetaData() 來獲得。

Java代碼??

Connection?conn?=?...;

DatabaseMetaData?dbMetaData?=?conn.getMetaData();

獲取所有表

Java代碼??

String?catalog?=?conn.getCatalog();?//catalog?其實也就是數據庫名

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 中創建值的方式。這些值為 "SYSTEM"、"USER" 和 "DERIVED"。(可能為 null)

獲取某個表的主鍵

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 => 主鍵中的序列號(值 1 表示主鍵中的第一列,值 2 表示主鍵中的第二列)。

PK_NAME String => 主鍵的名稱(可為 null)

獲取某個表的外鍵

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 => 被導入的主鍵表類別(可為 null)

PKTABLE_SCHEM String => 被導入的主鍵表模式(可為 null)

PKTABLE_NAME String => 被導入的主鍵表名稱

PKCOLUMN_NAME String => 被導入的主鍵列名稱

FKTABLE_CAT String => 外鍵表類別(可為 null)

FKTABLE_SCHEM String => 外鍵表模式(可為 null)

FKTABLE_NAME String => 外鍵表名稱

FKCOLUMN_NAME String => 外鍵列名稱

KEY_SEQ short => 外鍵中的序列號(值 1 表示外鍵中的第一列,值 2 表示外鍵中的第二列)

UPDATE_RULE short => 更新主鍵時外鍵發生的變化

DELETE_RULE short => 刪除主鍵時外鍵發生的變化

PK_NAME String => 主鍵的名稱(可為 null)

FK_NAME String => 外鍵的名稱(可為 null)

DEFERRABILITY short => 是否可以將對外鍵約束的評估延遲到提交時間

關鍵的技術問題已經解決,接下來就該具體實施了。刪除數據庫中沒有所以表中的數據,我想了一個簡單粗暴的方法,就是0.先把所有表中的外鍵刪除 1.刪除表中的所有數據 2.把外鍵再加回去。

總結

以上是生活随笔為你收集整理的java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。