MetaModel元数据模型-初识

本文介绍了MetaModel,一个用于重构SQL99兼容数据库元模型的工具,支持多种数据源如JDBC、CSV、JSON等。它提供了易用的API,类似SQL但类型安全,适用于编写跨存储系统的应用。

一、前言

1.简介

MetaModel 是用来重建 SQL 99 兼容的数据库元模型。
MetaModel 提供了一个数据为中心的 API 用于探索、查询和更新数据,数据格式支持关系数据库(JDBC)、CSV 文件、Excel 表格、MongoDB 和 CouchDB 等等。你可以编写真正跨存储系统的应用程序。
此外 MetaModel 的 API 非常易学易用,类似于 SQL 语法,但是类型安全的,你可以把它想象成 LinQ for Java。

2.文档

METAMODEL WIKI

Datastore type DataContext class name Properties “type” value Variants supported/available
JDBC / Relational Databases JdbcDataContext jdbc PostgreSQL, MySQL, Microsoft SQL Server, Oracle DB, IBM DB2 Apache Hive, Apache Derby, SQLite, Ingres, H2, HSQLDB (… and many more)
CSV files CsvDataContext csv Comma-separated Tab-separated Anything-separated files
Fixed width value files FixedWidthDataContext fixed-width Fixed width EBCDIC
Microsoft Excel spreadsheets ExcelDataContext excel .xls .xlsx
Microsoft Access database files AccessDataContext - .mdb .accdb
OpenOffice.org database files OpenOfficeDataContext - .odb
XML files XmlDomDataContext XmlSaxDataContext xml DOM-based parsing (all in-memory) SAX-based parsing (streaming)
JSON files JsonDataContext json
ElasticSearch ElasticSearchDataContext ElasticSearchRestDataContext elasticsearch Native Java API RESTful JSON API
MongoDB MongoDbDataContext - MongoDB 2.x MongoDB 3.x
Apache CouchDB CouchDbDataContext couchdb
Apache Cassandra CassandraDataContext cassandra
Apache HBase HBaseDataContext hbase
Apache Kafka KafkaDataContext
Neo4j Neo4jDataContext -
Salesforce.com SalesforceDataContext salesforce
SugarCRM SugarCrmDataContext -
Java collections PojoDataContext pojo Collection<Object[]> Collection<Map<String, Object>> Collection<JavaBean>
Collections of other datastores CompositeDataContext

二、集成

        <dependency>
            <groupId>org.apache.metamodel</groupId>
            <artifactId>MetaModel-full</artifactId>
            <version>5.3.3</version>
        </dependency>

三、使用示例

gitee源码:https://gitee.com/ryou5416/meta-model.git

1.CsvTest

package com.example.metamodel;

import org.apache.metamodel.DataContext;
import org.apache.metamodel.UpdateableDataContext;
import org.apache.metamodel.csv.CsvConfiguration;
import org.apache.metamodel.csv.CsvDataContext;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.factory.DataContextFactoryRegistryImpl;
import org.apache.metamodel.factory.DataContextPropertiesImpl;
import org.apache.metamodel.factory.ResourceFactory;
import org.apache.metamodel.insert.InsertInto;
import org.apache.metamodel.query.CompiledQuery;
import org.apache.metamodel.query.Query;
import org.apache.metamodel.query.QueryParameter;
import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.schema.TableType;
import org.apache.metamodel.util.AbstractResource;
import org.apache.metamodel.util.ClasspathResource;
import org.apache.metamodel.util.FileResource;
import org.apache.metamodel.util.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.util.Assert;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.List;

import static org.apache.metamodel.factory.DataContextPropertiesImpl.*;

/**
 * @author :ouruyi
 * @version 1.0
 * @date :Created in 2021/7/5 14:56
 * 功能描述:
 */
public class CsvTest {
   
   

    @Test
    void test1() {
   
   
        /**
         * 可设置表定义 {@link DataContextPropertiesImpl#PROPERTY_TABLE_DEFS}
         */
        final DataContextPropertiesImpl properties = new DataContextPropertiesImpl();
        properties.put(PROPERTY_DATA_CONTEXT_TYPE, "csv");
        properties.put(PROPERTY_COLUMN_NAME_LINE_NUMBER, 1);
        /**
         * 可用前缀 file classpath mem http https hdfs
         * @see ResourceFactory
         */
        properties.put(PROPERTY_RESOURCE_PROPERTIES, "classpath:/data/csv/data.csv");
        DataContext dataContext = DataContextFactoryRegistryImpl.getDefaultInstance().createDataContext(properties);
        final Schema schema = dataContext.getDefaultSchema();
        final List<Table> tables = schema.getTables(TableType.TABLE);
        final Table table = tables.get(0);
        DataSet result = dataContext.query().from(table).select(table.getColumns()).orderBy(table.getColumnByName("name")).execute();
        try {
   
   
            while (result.next()) {
   
   
                System.out.println("Row: " + Arrays.toString(result.getRow().getValues()));
            }
        } finally {
   
   
            result.close();
        }
    }

    @Test
    void test2() {
   
   
        /**
         * @see AbstractResource
         */
        Resource resource =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山境KL攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值