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 分析数据库中的表结构和主键外键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF中打印问题的探讨[转]
- 下一篇: java怎么复制别人的数据库_java-