帮酷LOGO
  • 显示原文与译文双语对照的内容
requery - modern SQL based query & persistence for Java / Kotlin / Android

  • 源代码名称:requery
  • 源代码网址:http://www.github.com/requery/requery
  • requery源代码文档
  • requery源代码下载
  • Git URL:
    git://www.github.com/requery/requery.git
  • Git Clone代码到本地:
    git clone http://www.github.com/requery/requery
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/requery/requery
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • requery

    用于 Java/Kotlin/Android的轻而强大的对象映射和SQL生成器,支持RxJava和 Java 8. 通过使用 Java,轻松映射到或者创建数据库,执行查询和更新。

    Build StatusDownload

    示例

    从抽象类定义实体:

    @EntityabstractclassAbstractPerson {
     @Key@Generatedint id;
     @Index("name_index") // table specificationString name;
     @OneToMany// relationships 1:1, 1:many, many to manySet<Phone> phoneNumbers;
     @Converter(EmailToStringConverter.class) // custom type conversionEmail email;
     @PostLoad// lifecycle callbacksvoidafterLoad() {
     updatePeopleList();
     }
     // getter, setters, equals & hashCode automatically generated into Person.java}

    或者从接口:

    @EntitypublicinterfacePerson {
     @Key@GeneratedintgetId();
     StringgetName();
     @OneToManySet<Phone>getPhoneNumbers();
     StringgetEmail();
    }

    或者使用不可变类型,如 @AutoValue 生成的类型:

    @AutoValue@EntityabstractclassPerson {
     @AutoValue.BuilderstaticabstractclassBuilder {
     abstractBuildersetId(intid);
     abstractBuildersetName(Stringname);
     abstractBuildersetEmail(Stringemail);
     abstractPersonbuild();
     }
     staticBuilderbuilder() {
     returnnewAutoValue_Person.Builder();
     }
     @KeyabstractintgetId();
     abstractStringgetName();
     abstractStringgetEmail();
    }

    ( 注意,在使用不可变类型时,某些特性将不可用,请参见这里的 )

    查询:基于 dsl的查询,映射到 SQL

    Result<Person> query = data
    . select(Person.class)
    . where(Person.NAME.lower().like("b%")).and(Person.AGE.gt(20))
    . orderBy(Person.AGE.desc())
    . limit(5)
    . get();

    关系: 用java5流。Observables或者普通iterables更有效地表示关系。 ( 集合和列表受支持)

    @EntityabstractclassAbstractPerson {
     @Key@Generatedint id;
     @ManyToManyResult<Group> groups;
     // equivalent to:// data.select(Group.class)//. join(Group_Person.class).on(Group_ID.equal(Group_Person.GROUP_ID))//. join(Person.class).on(Group_Person.PERSON_ID.equal(Person.ID))//. where(Person.ID.equal(id))}

    使用属性引用和中缀函数为 Kotlin 特定的支持:

    data {
     valresult= select(Person::class) where (Person::age gt 21) and (Person::name eq "Bob") limit 10}

    8流:

    data.select(Person.class)
    . orderBy(Person.AGE.desc())
    . get()
    . stream().forEach(System.out::println);

    Java可选和时间支持:

    publicinterfacePerson {
     @Key@GeneratedintgetId();
     StringgetName();
     Optional<String>getEmail();
     ZonedDateTimegetBirthday();
    }

    RxJava Observables Observables Observables::

    Observable<Person> observable = data
    . select(Person.class)
    . orderBy(Person.AGE.desc())
    . get()
    . observable();

    RxJava 观察表更改的查询:

    Observable<Person> observable = data
    . select(Person.class)
    . orderBy(Person.AGE.desc())
    . get()
    . observableResult().subscribe(::updateFromResult);

    读/写分离可以选择独立的查询( 正在读取) 和更新( 正在写入):

    int rows = data.update(Person.class)
    . set(Person.ABOUT, "student")
    . where(Person.AGE.lt(21)).get().value();

    特性

    • 无反射
    • 快速启动&性能
    • 无依赖项( RxJava是可选的)
    • 类型化查询语言
    • 表生成
    • 支持JDBC和最流行的数据库( MySQL 。Oracle 。SQL Server 。Postgres等)
    • 支持 Android ( SQLite,RecyclerView,数据绑定,SQLCipher )
    • 阻塞和非阻塞 API
    • 部分对象/刷新
    • simd支持
    • 高速缓存
    • 生命周期回调
    • 自定义类型转换器
    • 编译时间实体验证
    • JPA注释( 然而查询不是一个JPA提供者)

    反射自由

    requery使用编译时注释处理来生成实体模型类和映射属性。 这意味着你可以以使用标准光标和 ContentValues API从查询中读取对象的相同性能。

    带Java的查询

    编译类使用查询API来利用编译时生成的属性。 创建类型安全查询,避免维护困难,错误的字符串连接查询。

    关系

    你可以使用注释在模型中定义 One-to-One 。One-to-Many 。Many-to-One和Many-to-Many关系。 可以在两个方向上导航关系。 在许多类型关系中可以加载到标准的java Collection 对象中,或者成为更高效的结果。结果轻松创建流,RxJava观察,迭代器,列表或者映射。

    Many-to-Many连接表可以自动生成。 另外,在编译时验证关系模型消除运行时错误。

    vs JPA

    requery为持久化和执行查询提供了一系列现代化的接口。 查询和JPA提供程序之间的一些主要区别如 Hibernate 或者 EclipseLink:

    • 查询直接映射到 SQL,而不是 JPQL 。
    • 通过DSL而不是冗长的CriteriaQuery API轻松完成的动态查询。
    • 使用易于理解的扩展/生成代码代替反射/字节码编织,用于状态跟踪和成员访问

    Android

    专门设计的Android支持。 有关Android项目的示例,请参见 /requery示例使用数据绑定和基于接口的实体。 有关更多信息,请参见页面。

    支持数据库

    在一些最受欢迎的数据库上进行了测试:

    • PostgresSQL ( 9.1+ )
    • MySQL 5.x
    • Oracle 12 c +
    • Microsoft SQL Server 2012或者更高版本
    • SQLite ( Android或者使用 xerial 驱动程序)
    • Apache Derby 10.11 +
    • H2 1.4 +
    • HSQLDB 2.3 +

    注释

    支持映射到requery注释的JPA注释的子集。 有关更多信息,请参见这里的

    Upserts

    使用适当的数据库特定查询语句生成 Upserts:

    • oracle/SQL Server/hsql: merge into when matched/not matched
    • PostgresSQL: on conflict do update ( 需要 9.5或者更高版本)
    • MySQL: on duplicate key update

    使用它

    bintray jcenter/Maven 中心提供了版本。

    repositories {
     jcenter()
    }dependencies {
     compile 'io.requery:requery:1.5.1' compile 'io.requery:requery-android:1.5.1'// for android annotationProcessor 'io.requery:requery-processor:1.5.1'}

    有关gradle和注释处理 & gradle的信息,请参见 wiki文档。

    许可证

    Copyright (C) 2018 requery.io
    Licensed under the Apache License, Version 2.0 (the"License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an"AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.



    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语