Java中的数据库架构导航
以下是有关数据库架构导航的一些想法:
标准品
SQL-92标准定义了RDBMS如何实现包含其字典表的INFORMATION_SCHEMA。 实际上,某些RDBMS确实实现了标准规范的某些部分。 这些RDBMS附带了该标准的某些实现。
接近标准
- HSQLDB:非常接近真实标准
- Postgres:接近标准,但有一些调整(也有专有的字典表)
- SQL Server:接近标准但不完整(也具有专有的字典表)
标准的自由解释
- H2(最近有一些向后不兼容的更改)
- MySQL(仅从5.0开始,还具有专有的字典表)
其他RDBMS提供了他们自己的字典表概念。 对于像jOOQ这样的模式导航工具来说,要掌握这些技巧非常棘手。 字典表格局可以这样描述(我的偏见):
整齐有据的字典表
- DB2:这些字典表在某种程度上看起来像标准的,但名称不同。 他们感到直观。
- Oracle:在我看来,字典视图的集合要比标准提议的字典视图更好。 在整个Internet上非常易于理解和文档完善
- SQLite:没有字典表,但是SQLite存储过程使用起来非常简单。 毕竟这是一个简单的数据库
难以理解,没有详细记录的字典表
- Derby:创建了企业集团的概念,而不是使用通常的数据库语言,例如关系,键等。
- MySQL:旧的mysql模式非常痛苦。 幸运的是,MySQL 5.0不再适用
- Ingres:好吧……Ingres是一个古老的数据库 。 可用性并不是70年代的主要内容之一。
- Sybase SQL Anywhere:许多必须以复杂关系连接的对象。 文件稀缺
- Sybase ASE:比SQL Anywhere还要困难。 某些数据只能通过“技巧”获得
JDBC抽象
字典表的多样性似乎要求标准抽象。 尽管实际上可以在大多数RDBMS中实现SQL-92标准,但JDBC抽象甚至更好。 JDBC知道DatabaseMetaData对象,并允许轻松导航数据库模式。 不幸的是,此API 有时会抛出SQLFeatureNotSupportedException 。 关于哪个JDBC驱动程序实现多少API以及何时需要解决方法,没有通用的规则。 对于jOOQ代码生成,这些事实使该API毫无用处。
其他工具
如前所述,开源世界中还有其他一些工具。 在jOOQ中使用这些工具有一些缺点:
- 据我所知,这两个工具均已获得LGPL许可,这与jOOQ的Apache 2许可证不太兼容。
- 两种工具都很好地导航了实体关系,但是似乎缺乏对许多非标准构造的支持,例如UDT,高级存储过程用法(例如,返回游标,UDT等),ARRAY
- SchemaCrawler仅支持8个RDBMS,jOOQ现在有12个
- 两种工具都不活跃。 看这里和这里
有关更多信息,请访问其网站:
- 模式爬虫
- 模式间谍
Jooq-meta
由于上述原因,jOOQ附带了自己的数据库模式导航:jooq-meta。 该模块可以单独用作JDBC的DatabaseMetaData,SchemaCrawler或SchemaSpy的替代。 jooq-meta使用jOOQ设计的查询来导航数据库元数据,因此它也是集成测试套件的一部分。 例如,查看如何使用jooq-meta导航Ingres外键关系:
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();
结论
再一次可以说,RDBMS的世界是非常不同的。 Java中的数据库抽象仅在某种程度上在诸如JDBC,Hibernate / JPA之类的技术以及诸如SchemaCrawler,SchemaSpy和jooq-meta之类的第三方库中建立。
参考: JCG合作伙伴在“ Java,SQL和jOOQ”博客上提供的 Java数据库模式导航 。
- 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
Java中的数据库架构导航相关推荐
- Java中获取数据库中两个时间的相差秒数
场景 Java中获取数据库中结束时间与开始时间相差的秒数. 实现 Long betweenTime=0l;betweenTime =((b.getFinishTime().getTime()-b.ge ...
- Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...
- java中实现数据库备份
java中实现数据库备份 1.直接上代码 public void backup() {File file = new File(backupConfig.getBackupPath());if (!f ...
- java对数据库的增删改查_在java中对数据库进行增删改查
代码区域: package com.oracle.jdbc.demo1; import java.sql.Connection; import java.sql.DriverManager; impo ...
- java中的各种架构
常见包名的含义: dao 数据库操作,增删改查,jdbc中具体的数据处理 model 一般是javabean对象,与数据库的某个表相关联 service 供外部调用,等于对dao,model等进行了包 ...
- java中的数据库事务处理
/*java使用事务处理,首先要求数据库支持事务,如使用MYSQL的事务功能, 就要求mysql的表类型为Innodb,*/ /*InnoDB,是MySQL的数据库引擎之一 与传统的ISAM与MyIS ...
- java中常见数据库字段类型与java.sql.Types的对应
转自:http://blog.csdn.net/hbzyaxiu520/article/details/5457225 常见数据库字段类型与java.sql.Types的对应 Oracle与java. ...
- java中的数据库操作_Java中数据库操作的流程介绍
1.java数据库操作基本流程 a .数据库连接1.Drivermanager 链接数据库 String className,url,uid,pwd; className="oracle.j ...
- java埋点数据库架构_7. 使用Java代码创造埋点数据
创建Maven工程 在pom.xml文件中添加内容: 1.7.20 1.0.7 com.alibaba fastjson 1.2.51 ch.qos.logback logback-core ${lo ...
最新文章
- 测试思想 什么是软件测试(摘录)
- JAVA中indexOf函数用法
- Sum in the tree
- 滴滴java开发面试题_滴滴java面试重点汇总
- python语言基础与应用慕课课堂测试_中国大学MOOC(慕课)_Python语言基础与应用_题库2020...
- Day05:装饰器,三元表达式,函数的递归,匿名/内置函数,迭代器,模块,开发目录...
- LeetCode(1002)——查找常用字符(JavaScript)
- 【论文写作】本科、硕士研究生毕业论文格式问题
- JavaScript:堆栈溢出内存泄漏
- c:forTokens
- 如何在jdk官网下载想要的版本
- 像素值,像素坐标,灰度值
- springboot+vue开发小说网站及作品写作发布
- 【Impala】基于Hive的快速大数据查询引擎——Impala知识点总结
- 1)华为手机使用电脑批量管理联系人 - 2)华为云空间联系人同步到手机 - 3)华为手机导入联系人列表
- 《守望先锋》中网络脚本化的武器和技能系统
- golang mongodb驱动mgo异常崩溃问题
- 苹果输入法怎么换行_朋友圈不折叠的N种方法安卓苹果通用
- 30_ElasticSearch IK分词器配置文件 以及自定义词库
- 回溯法——电话号码的字母组合
热门文章
- selenium自动化测试_49自动化测试中最常见的Selenium异常
- win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例
- hibernate查询缓存_Hibernate查询缓存如何工作
- 游戏 服务器 微服务_整体服务器与微服务
- javaserver_如何在JavaServer Pages中使用Salesforce REST API
- modbus调试时间超时_Java调试器和超时
- jdk8 接口抽象类区别_JDK 8时代的抽象类与接口
- mapreduce 算法_MapReduce算法–了解数据联接第二部分
- Java时间和日期指南
- JBoss Fuse:使用JEXL的动态蓝图文件