Ein leichter, aber leistungsstarker Objektzuordnungs- und SQL-Generator für Java/Kotlin/Android mit RxJava- und Java 8-Unterstützung. Einfaches Zuordnen zu oder Erstellen von Datenbanken, Durchführen von Abfragen und Aktualisierungen von jeder Plattform aus, die Java verwendet.
Definieren Sie Entitäten aus einer abstrakten Klasse:
@ Entity
abstract class AbstractPerson {
@ Key @ Generated
int id ;
@ Index ( "name_index" ) // table specification
String name ;
@ OneToMany // relationships 1:1, 1:many, many to many
Set < Phone > phoneNumbers ;
@ Converter ( EmailToStringConverter . class ) // custom type conversion
Email email ;
@ PostLoad // lifecycle callbacks
void afterLoad () {
updatePeopleList ();
}
// getter, setters, equals & hashCode automatically generated into Person.java
}
oder über eine Schnittstelle:
@ Entity
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
@ OneToMany
Set < Phone > getPhoneNumbers ();
String getEmail ();
}
oder verwenden Sie unveränderliche Typen wie die von @AutoValue generierten:
@ AutoValue
@ Entity
abstract class Person {
@ AutoValue . Builder
static abstract class Builder {
abstract Builder setId ( int id );
abstract Builder setName ( String name );
abstract Builder setEmail ( String email );
abstract Person build ();
}
static Builder builder () {
return new AutoValue_Person . Builder ();
}
@ Key
abstract int getId ();
abstract String getName ();
abstract String getEmail ();
}
(Beachten Sie, dass einige Funktionen bei Verwendung unveränderlicher Typen nicht verfügbar sind, siehe hier)
Abfragen: DSL-basierte Abfrage, die SQL zuordnet
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 ();
Beziehungen: Repräsentieren Sie Beziehungen effizienter mit Java 8 Streams, RxJava Observables oder einfachen Iterables. (Sets und Listen werden unterstützt)
@ Entity
abstract class AbstractPerson {
@ Key @ Generated
int id ;
@ ManyToMany
Result < 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-spezifische Unterstützung mithilfe von Eigenschaftsverweisen und Infixfunktionen:
data {
val result = select( Person :: class ) where ( Person ::age gt 21 ) and ( Person ::name eq " Bob " ) limit 10
}
Java 8-Streams:
data . select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. stream (). forEach ( System . out :: println );
Java 8 optionale und zeitlich begrenzte Unterstützung:
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
Optional < String > getEmail ();
ZonedDateTime getBirthday ();
}
RxJava-Observablen:
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observable ();
RxJava beobachtet Abfrage zu Tabellenänderungen:
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observableResult (). subscribe (:: updateFromResult );
Lese-/Schreibtrennung Zusammen mit unveränderlichen Typen optional getrennte Abfragen (Lesen) und Aktualisierungen (Schreiben):
int rows = data . update ( Person . class )
. set ( Person . ABOUT , "student" )
. where ( Person . AGE . lt ( 21 )). get (). value ();
requery nutzt die Annotationsverarbeitung zur Kompilierungszeit, um Entitätsmodellklassen und Zuordnungsattribute zu generieren. Unter Android bedeutet dies, dass Sie beim Lesen von Objekten aus einer Abfrage ungefähr die gleiche Leistung erzielen, als ob sie mit der Standard-Cursor- und ContentValues-API ausgefüllt würde.
Die kompilierten Klassen arbeiten mit der Abfrage-API zusammen, um die Vorteile der zur Kompilierungszeit generierten Attribute zu nutzen. Erstellen Sie typsichere Abfragen und vermeiden Sie schwer zu wartende, fehleranfällige Abfragen mit Zeichenfolgen.
Mithilfe von Anmerkungen können Sie Eins-zu-Eins-, Eins-zu-Viele-, Viele-zu-Eins- und Viele-zu-Viele-Beziehungen in Ihren Modellen definieren. Beziehungen können in beide Richtungen navigiert werden. Viele Typbeziehungen können in Standard-Java-Sammlungsobjekte oder in einen effizienteren Ergebnistyp geladen werden. Erstellen Sie aus einem Ergebnis ganz einfach einen Stream, ein RxJava-Observable, einen Iterator, eine Liste oder eine Karte.
Viele-zu-viele-Verbindungstabellen können automatisch generiert werden. Darüber hinaus wird das Beziehungsmodell zur Kompilierungszeit validiert, wodurch Laufzeitfehler vermieden werden.
requery bietet einen modernen Satz von Schnittstellen zum Persistieren und Ausführen von Abfragen. Einige wichtige Unterschiede zwischen Requery- und JPA-Anbietern wie Hibernate oder EclipseLink:
CriteriaQuery
API problemlos über eine DSL durchgeführt werden.Speziell für die Android-Unterstützung entwickelt. Unter requery-android/example finden Sie ein Beispiel für ein Android-Projekt, das Datenbindung und schnittstellenbasierte Entitäten verwendet. Weitere Informationen finden Sie auf der Android-Seite.
Getestet auf einigen der beliebtesten Datenbanken:
Eine Teilmenge der JPA-Annotationen, die den Requery-Annotationen zugeordnet sind, wird unterstützt. Weitere Informationen finden Sie hier.
Upserts werden mit den entsprechenden datenbankspezifischen Abfrageanweisungen generiert:
merge into when matched/not matched
on conflict do update
(erfordert 9.5 oder höher)on duplicate key update
Versionen sind auf bintray jcenter/maven central verfügbar.
repositories {
jcenter()
}
dependencies {
compile ' io.requery:requery:1.6.1 '
compile ' io.requery:requery-android:1.6.1 ' // for android
annotationProcessor ' io.requery:requery-processor:1.6.1 '
}
Informationen zur Gradle- und Annotationsverarbeitung sowie zu Gradle finden Sie im Wiki.
Copyright (C) 2019 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.