最近,Human Inference和Apache软件基金会(ASF)分别宣布了捐赠与接受MetaModel项目的消息, 今后MetaModel将成为一个Apache孵化器项目。此前,MetaModel遵循LGPL许可证,由Human Inference的 产品开发团队管理,但现在已经转移到了ASF上,将遵循新的许可证、拥有新的社区、接受新的管理。那 么这个项目到底是什么呢?它又有哪些用途?
MetaModel是一个Java类库,设计它的目的是提供 一个可以与任何数据存储(不论是关系型数据库、NoSQL数据库,还是电子表格或者其他格式的文件)进 行交互的单一接口。我们的意思是,通过交互来搜索元数据,查询、写入或更改数据存储中保存的数据 。很显然,高层次抽象会丢失一些细节,会带来过度概括和丢失重要特性的风险。我们不想把关系型SQL 数据库的功能减化到只有像(SELECT * FROM [table])这样的全表扫描。但另一方面,我们也不想暴露 一些只能在特定品牌特定版本的SQL服务器上才能使用的功能,因为这些功能无法在任何其他数据存储上 使用。最终,我们想基于现有的常规技能(比如标准SQL)建立数据交互方式。
元数据处理
那么,MetaModel项目为数据存储的方法做了怎样的抽象?该项目通过Java接口发布了一个非常 类似于SQL的查询模型,有时该模型也可从字符中解析。由于把查询定义为常规的Java对象,就能容易地 解析查询(取决于底层技术),并能根据底层技术细节选择最佳的执行策略。这意味着MetaModel不仅提 供了一个接口,还提供了一个完整的查询引擎,这个引擎在查询时可以处理部分或者全部任务。如果你 使用的是关系型JDBC数据库,会在数据库的本地引擎上执行99%的查询。但是如果使用了MetaModel,就 可以利用它的查询引擎把数据切片、切块,就能在CSV文件或Excel电子表格上执行同样的查询了。同时 ,你根本不必修改查询语句。
当然,这得假设你数据存储的元数据与数据结构是兼容的。不同的 数据存储以不同的方式暴露或推理元数据。JDBC数据库通常会通过JDBC元数据API暴露元数据。文件格式 (比如CSV和Excel表格)并没有很明确地定义,通常可以读取文件的首行内容获取它们的元数据。还有 种比较极端的情况,有一些NoSQL数据库甚至根本就没有元数据。MetaModel可以让你选择暴露元数据的 方式,你可以指定是以编程方式暴露,或通过检查数据存储的前N条记录的方式来推理出元数据。
MetaModel中最核心的设计是DataContext接口,它表示数据存储,可以用它来浏览和查询该数据 存储。此外,它的子接口UpdateableDataContext表示可写的数据存储,可以用它更新数据。一旦你拥有 了DataContext实例,就可以或多或少地学习使用类库代码补全的功能了。这里有几个DataContext实现 的典型示例,让我们来看看它们是如何实例化的:
// a DataContext for a CSV file UpdateableDataContextcsv = new CsvDataContext(new File(“data.csv”)); // a DataContext for an Excel spreadsheet UpdateableDataContext excel = new ExcelDataContext(new File(“spreadsheet.xlsx”)); // a DataContext for a JDBC database (can use either DataSource or Connection) java.sql.DataSourcedataSource = … UpdateableDataContextjdbc = new JdbcDataContext(dataSource); // a DataContext for an XML file (where metadata is automatically inferred) DataContext xml = new XmlDomDataContext(new File(“data.xml”)); // a DataContext for connecting to Salesforce.com’s data web services UpdateableDataContextsalesforce = newSalesforceDataContext(username, pw, securityToken); // a in-memory DataContext for POJOs (useful for testing and mocking) Person record1 = ... Person record2 = ... TableDataProvidertableDataProvider = new ObjectTableDataProvider( “persons”, Person.class, Arrays.asList(record1, record2)); UpdateableDataContextpojos = new PojoDataContext(“schema”, tableDataProvider);
对于MetaModel来说元数据极为重要,它不仅用来管理数据结构,而且还用来定义查询。如果 你的查询要确保使用了适当的元数据,就需要投入大量的精力保证查询的安全性。因此,作为一名开发 人员,你在查询之前就要持有元数据对象。举例来说,如果你知道有一张表,表名是ORDER_LINE,它有 一列是price,另一列是order_id,那么就可以用寻常的硬编码方式去查询所需的元数据(显然,只有你 熟悉数据存储时才能使用这种方式):
DataContextdataContext = ... // the DataContext object represents the ‘connection’ Table orderLines = dataContext.getTableByQualifiedLabel(“ORDER_LINES”); Column price = orderLines.getColumnByName(“price”); Column orderId = orderLines.getColumnByName(“order_id”);
此外,你还可以使用API基于探索的方式动态获取元数据。当你想为用户提供定制查询时,这 种方式就能发挥巨大的作用了,你可以用这种方式为用户提供可用的表和列,让用户自己选择所需的查 询。
Schema[] schema = dataContext.getSchemas(); Table[] tables = schemas[0].getTables(); Column[] columns = tables[0].getColumns();
MetaModel还一个非常重要的思想,它把元数据、查询和其他数据交互都当作是对象。查询在 MetaModel中就是一个普通的Java对象,所以你可以在执行之前篡改它,也可以把它分发出去。这使应用 程序可以创建由不同代码块协作完成的复合工作流程,在优化查询计划时就不必再面对冗长的SQL字符串 操作了。它对类型安全也很有帮助,举例来说,查询模型是基于像列、表等类型安全的结构来描述模型 的,而不是采用模糊不清的字符串常量。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 数据
, 查询
, 数据存储
, 一个
, 方式
, 跨数据库查询
, sql跨数据库查询
java解析csv文件
,以便于您获取更多的相关知识。