Java中的数据库架构导航
以下是有關(guān)數(shù)據(jù)庫架構(gòu)導航的一些想法:
標準品
SQL-92標準定義了RDBMS如何實現(xiàn)包含其字典表的INFORMATION_SCHEMA。 實際上,某些RDBMS確實實現(xiàn)了標準規(guī)范的某些部分。 這些RDBMS附帶了該標準的某些實現(xiàn)。
接近標準
- HSQLDB:非常接近真實標準
- Postgres:接近標準,但有一些調(diào)整(也有專有的字典表)
- SQL Server:接近標準但不完整(也具有專有的字典表)
標準的自由解釋
- H2(最近有一些向后不兼容的更改)
- MySQL(僅從5.0開始,還具有專有的字典表)
其他RDBMS提供了他們自己的字典表概念。 對于像jOOQ這樣的模式導航工具來說,要掌握這些技巧非常棘手。 字典表格局可以這樣描述(我的偏見):
整齊有據(jù)的字典表
- DB2:這些字典表在某種程度上看起來像標準的,但名稱不同。 他們感到直觀。
- Oracle:在我看來,字典視圖的集合要比標準提議的字典視圖更好。 在整個Internet上非常易于理解和文檔完善
- SQLite:沒有字典表,但是SQLite存儲過程使用起來非常簡單。 畢竟這是一個簡單的數(shù)據(jù)庫
難以理解,沒有詳細記錄的字典表
- Derby:創(chuàng)建了企業(yè)集團的概念,而不是使用通常的數(shù)據(jù)庫語言,例如關(guān)系,鍵等。
- MySQL:舊的mysql模式非常痛苦。 幸運的是,MySQL 5.0不再適用
- Ingres:好吧……Ingres是一個古老的數(shù)據(jù)庫 。 可用性并不是70年代的主要內(nèi)容之一。
- Sybase SQL Anywhere:許多必須以復雜關(guān)系連接的對象。 文件稀缺
- Sybase ASE:比SQL Anywhere還要困難。 某些數(shù)據(jù)只能通過“技巧”獲得
JDBC抽象
字典表的多樣性似乎要求標準抽象。 盡管實際上可以在大多數(shù)RDBMS中實現(xiàn)SQL-92標準,但JDBC抽象甚至更好。 JDBC知道DatabaseMetaData對象,并允許輕松導航數(shù)據(jù)庫模式。 不幸的是,此API 有時會拋出SQLFeatureNotSupportedException 。 關(guān)于哪個JDBC驅(qū)動程序?qū)崿F(xiàn)多少API以及何時需要解決方法,沒有通用的規(guī)則。 對于jOOQ代碼生成,這些事實使該API毫無用處。
其他工具
如前所述,開源世界中還有其他一些工具。 在jOOQ中使用這些工具有一些缺點:
- 據(jù)我所知,這兩個工具均已獲得LGPL許可,這與jOOQ的Apache 2許可證不太兼容。
- 兩種工具都很好地導航了實體關(guān)系,但是似乎缺乏對許多非標準構(gòu)造的支持,例如UDT,高級存儲過程用法(例如,返回游標,UDT等),ARRAY
- SchemaCrawler僅支持8個RDBMS,jOOQ現(xiàn)在有12個
- 兩種工具都不活躍。 看這里和這里
有關(guān)更多信息,請訪問其網(wǎng)站:
- 模式爬蟲
- 模式間諜
Jooq-meta
由于上述原因,jOOQ附帶了自己的數(shù)據(jù)庫模式導航:jooq-meta。 該模塊可以單獨用作JDBC的DatabaseMetaData,SchemaCrawler或SchemaSpy的替代。 jooq-meta使用jOOQ設(shè)計的查詢來導航數(shù)據(jù)庫元數(shù)據(jù),因此它也是集成測試套件的一部分。 例如,查看如何使用jooq-meta導航Ingres外鍵關(guān)系:
Result<Record> result = create().select(IirefConstraints.REF_CONSTRAINT_NAME.trim(),IirefConstraints.UNIQUE_CONSTRAINT_NAME.trim(),IirefConstraints.REF_TABLE_NAME.trim(),IiindexColumns.COLUMN_NAME.trim()).from(IICONSTRAINTS).join(IIREF_CONSTRAINTS).on(Iiconstraints.CONSTRAINT_NAME.equal(IirefConstraints.REF_CONSTRAINT_NAME)).and(Iiconstraints.SCHEMA_NAME.equal(IirefConstraints.REF_SCHEMA_NAME)).join(IICONSTRAINT_INDEXES).on(Iiconstraints.CONSTRAINT_NAME.equal(IiconstraintIndexes.CONSTRAINT_NAME)).and(Iiconstraints.SCHEMA_NAME.equal(IiconstraintIndexes.SCHEMA_NAME)).join(IIINDEXES).on(IiconstraintIndexes.INDEX_NAME.equal(Iiindexes.INDEX_NAME)).and(IiconstraintIndexes.SCHEMA_NAME.equal(Iiindexes.INDEX_OWNER)).join(IIINDEX_COLUMNS).on(Iiindexes.INDEX_NAME.equal(IiindexColumns.INDEX_NAME)).and(Iiindexes.INDEX_OWNER.equal(IiindexColumns.INDEX_OWNER)).where(Iiconstraints.SCHEMA_NAME.equal(getSchemaName())).and(Iiconstraints.CONSTRAINT_TYPE.equal("R")).orderBy(IirefConstraints.REF_TABLE_NAME.asc(),IirefConstraints.REF_CONSTRAINT_NAME.asc(),IiindexColumns.KEY_SEQUENCE.asc()).fetch();結(jié)論
再一次可以說,RDBMS的世界是非常不同的。 Java中的數(shù)據(jù)庫抽象僅在某種程度上在諸如JDBC,Hibernate / JPA之類的技術(shù)以及諸如SchemaCrawler,SchemaSpy和jooq-meta之類的第三方庫中建立。
參考: JCG合作伙伴在“ Java,SQL和jOOQ”博客上提供的 Java數(shù)據(jù)庫模式導航 。
相關(guān)文章 :- Java Persistence API:快速入門
- GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
- JBoss 4.2.x Spring 3 JPA Hibernate教程
- Hibernate映射集合性能問題
翻譯自: https://www.javacodegeeks.com/2011/09/database-schema-navigation-in-java.html
總結(jié)
以上是生活随笔為你收集整理的Java中的数据库架构导航的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发教程–可调用,将来
- 下一篇: 没带身份证可以住酒店吗 没带身份证能不能