
Exposed ist eine leichte SQL -Bibliothek auf einem JDBC -Treiber für die Kotlin -Sprache. Exposed hat zwei Geschmacksrichtungen für den Datenbankzugriff: TypeSafe SQL -Wraping DSL und Lightweight Data Access Objects (DAO).
Mit Exposed haben Sie zwei Optionen für den Datenbankzugriff: DSL und einen leichten DAO. Unser offizielles Maskottchen ist der Tintenfisch, der für seine herausragende Mimikry-Fähigkeit bekannt ist, die es ihm ermöglicht, sich nahtlos in jede Umgebung zu mischen. Ähnlich wie unser Maskottchen kann exponiert werden, um eine Vielzahl von Datenbankmotoren nachzuahmen, mit denen Sie Anwendungen ohne Abhängigkeiten von einer bestimmten Datenbank -Engine erstellen und mit sehr geringen oder keinen Änderungen zwischen ihnen wechseln können.
H2 (Versionen 2.x; 1.x Version ist veraltet und wird in zukünftigen Veröffentlichungen entfernt)
(Auch PostgreSQL unter Verwendung des PGJDBC-NG JDBC-Treibers)
Freigaben von Exposed sind im Maven Central Repository erhältlich. Sie können dieses Repository in Ihrem Build -Skript wie folgt deklarieren:
Warnung: Möglicherweise müssen Sie Ihr Kotlin JVM -Ziel auf 8 und bei der Verwendung von Spring auf 17 einstellen, damit dies ordnungsgemäß funktioniert:
Repositories {// Versionen nach 0,30.1 // Versionen vor 0.30.1 sind für NOCKAVENCENTRAL () nicht verfügbar
}Das Maven Central Repository ist standardmäßig für Maven -Benutzer aktiviert.
Exposed besteht aus den folgenden Modulen:
Exponiertes Kernmodul, das beide DSL -API sowie die Zuordnung enthält
Exposed-Crypt-Bietet zusätzliche Spaltentypen zum Speichern verschlüsselter Daten in DB und codieren/dekodieren sie auf clientseitig
exponiertes -dao - Dao API
Exponierte-Java-Zeit-Datumszeit-Erweiterungen basierend auf der Java8-Zeit-API
Exponierte -JDBC - Implementierung der Transportebene basierend auf Java JDBC API
Exponte-Jodatime-Datumszeit-Erweiterungen basierend auf der Jodatime-Bibliothek
Exponte -Json - JSON- und JSONB -Datentyp -Erweiterungen
exponierte Kotlin-datetime-Datum-Zeit-Erweiterungen basierend auf Kotlinx-Daten
Exponiertes Geld-Erweiterungen zur Unterstützung von Geldamobilien von "javax.money:Money-api"
Exponse-Spring-Boot-Starter-Ein Starter für den Spring-Boot, der als ORM statt Hibernate ausgesetzt ist
<Depecies>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactid> exposed-core </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactId> exponiertes Krypt </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactid> exponiertes-dao </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<GruppeId> org.jetbrains.exposed </Groupid>
<artifactid> exposed-java-Zeit </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactid> exponiert-jdbc </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactid> exponiertes Jodatime </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<GruppeId> org.jetbrains.exposed </Groupid>
<artifactid> exposed-json </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<GruppeId> org.jetbrains.exposed </Groupid>
<artifactId> exponiertes-kotlin-dateTime </artifactId>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactid> Exposed-Geld </artifactid>
<version> 0.56.0 </Version>
</abhängig>
<De vorangehen>
<gruppe> org.jetbrains.exposed </Groupid>
<artifactId> exponierte Spring-Boot-Starter </artifactid>
<version> 0.56.0 </Version>
</abhängig>
</Abhängigkeiten> Abhängigkeiten {
Implementierung 'org.jetbrains.exposed:exposed-core:0.56.0'implementation' org.jetbrains.exposed 'org.jetbrains.exposed: Exponsed-Jdbc:0.56.0'
Implementierung 'org.jetbrains.exposed:exposed-jodatime:0.56.0'//implementation' org.jetbrains.exposed:exposed-java-time:0.56.0'//implementation 'org.jetbrains.exposed DateTime: 0,56,0 '
Implementierung 'org.jetbrains.exposed: Exponsed-Json:0.56.0'Implementation' org.jetbrains.exposed: Exposed-money:0.56.0'implementation 'org.jetbrains.exposed:Exposed-Spst-Boot-Starter:0.56. 0 '} In build.gradle.kts :
Val Exposedversion: Zeichenfolge nach Projekt
Abhängigkeiten {
Implementierung ("org.jetbrains.exposed: Exposed-core:$ exponierteversion"))
Implementierung ("org.jetbrains.exposed: Exposed-Crypt: $Exposedversion")
Implementierung ("org.jetbrains.exposed: exponted-dao:$exposedversion"))
Implementierung ("org.jetbrains.exposed: Exposed-Jdbc:$exposedversion")
Implementierung ("org.jetbrains.exposed: Exposed-Jodatime:$Exposedversion") // orimplementation ("org.jetbrains.exposed:exposed-java-time:$ exposedversion") // Orimplementation ("org.jetbrains -Kotlin-dateTime: $ exposedversion ")
Implementierung ("org.jetbrains.exposed: Exposed-Json:$exposedversion")
Implementierung ("org.jetbrains.exposed: Exposed-money: $Exposedversion"))
Implementierung ("org.jetbrains.exposed: Exposed-Spring-Boot-Starter:$exposedversion"))
} und in gradle.properties
exposedVersion=0.56.0
Schauen Sie sich die Beispiele für einen kurzen Start an.
Derzeit ist Exposed für Maven/Gradle -Builds erhältlich. Überprüfen Sie den Maven Central und lesen Sie den Einblick, um den Einrichten von Exponierten zu erhalten.
Weitere Informationen finden Sie in den folgenden Links:
Dokumentation mit Beispielen und Dokumenten
Beitrag zu exponiert
Migrationsleitfaden
Veränderungen und alle Migrationsdetails brechen
Slack -Kanal
Ausgabe Tracker
Bitte beachten Sie, dass wir uns von GitHub -Problemen entfernen, um Fehler und Funktionen zu melden. Bitte protokollieren Sie neue Anfragen auf yotrack. Sie müssen angemeldet sein, um Probleme anzuzeigen und zu protokollieren, andernfalls werden Sie mit einem 404 getroffen.
Haben Sie Fragen? Fragen Sie eine Einladung für den Kotlinlang Slack an und treten Sie dem Projektgespräch in unserem #exponierten Kanal an.
Wir begrüßen Ihre Pull -Anfragen aktiv. Die Verknüpfung Ihrer Arbeit mit einem vorhandenen Problem wird jedoch bevorzugt.
Geben Sie das Repo auf und erstellen Sie Ihren Zweig vom Main.
Nennen Sie Ihren Zweig etwas, das für die Arbeit, die Sie erledigen, beschreibend ist. IE fügt New-Thing hinzu.
Wenn Sie Code hinzugefügt haben, der getestet werden sollte, fügen Sie Tests hinzu und stellen Sie sicher, dass die Testsuite besteht.
Stellen Sie sicher, dass Sie alle Fusselwarnungen ansprechen.
Wenn Sie den vorhandenen Code besser machen, teilen Sie uns dies bitte in Ihrer PR -Beschreibung mit.
Weitere Informationen finden Sie in den Beitragsrichtlinien.
importieren org.jetbrains.exposed.sql.*Importieren org.jetbrains.exposed.sql.sqlexpressionBuilder.likeMport org.jetbrains.exposed.sql.transactions.transactionObject User: Tabelle () {val id: columne <string> = varchar ("(" id ", 10) Valungsname: Spalte <string> = varchar (" Name ", Länge = 50) Val CityID: Spalte <int?> = (Integer ("City_id") referenzstädte.id) .Nullable () überschreiben Val PrimaryKey = primaryKey (id, name = "pk_user_id") // Name ist hier optional} Objektstädte: Tabelle (Tabelle (Tabelle (Tabelle ) {val id: column <int> = integer ("id"). autoincrement () valername: column <string> = varchar ("name", 50) override val primärkey = primaryKey (id, name = "pk_cities_id"))
} Fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", passwart = "")
Transaktion {
Addlogger (StDoutsQLlogger) SchemaUtils.create (Städte, Benutzer) Val Saintpetersburgid = Städte.insert {
IT [name] = "St. Petersburg"} Get Cities.idval munichid = Städte.insert {
it [name] = "munich"} Get Cities.idval Pragid = Städte.insert {
IT.Update (Name, StringLiteral ("Prag") .trim (). Substring (1, 2))
} [Cities.id] val praguename = cities.selectall (). Wob
Es [id] = "andrey" it [name] = "andrey" it [user.cityId] = saintpetersburgid
} User.insert {
Es [id] = "Sergey" it [name] = "sergy" it [user.cityId] = munichid
} User.insert {
Es [id] = "Eugene" it [name] = "eugene" it [user.cityId] = munichid
} User.insert {
IT [id] = "Alex" it [name] = "Alex" it [user.cityId] = null} user.insert {
IT [id] = "smth" it [name] = "etwas" it [user.cityId] = null} user.update ({user.id eq "ax meal"}) {
Es [Name] = "Alexey"} user.deletewhere {user.name wie "%Thing"} println ("Alle Städte:") für (Stadt in Städten.Selectall ()) {println ("$ {City [Städte. ID]}: $ {City [Cities.name]} ")
} println ("Manual Join:")
(Benutzer Innerjoin Städte)
.Select (Benutzer.name, Städte.name)
.Wo {
(Users.id.eq ("andrey") oder user.name.eq ("sergey") andusers.id.eq ("sergey") und user.cityId.eq (Cities.id)
} .foreach {println ("$ {it [user.name]} lebt in $ {it [cities.name]}")
} println ("Mit fremden Schlüssel beitreten:")
(Benutzer Innerjoin Städte)
.Select (users.name, users.cityId, cities.name)
.where {Cities.name.eq ("st. Petersburg") oder users.cityId.isnull ()}
.foreach {it (it [user.cityId]!
} else {println ("$ {it [user.name]} lebt nirgendwo")
}
} println ("Funktionen und Gruppe von:")
((Städte Innerjoin -Benutzer)
.Select (cities.name, users.id.count ())
.Groupby (Städte.name)
. )
} else {println ("Niemand lebt in $ CityName")
}
} SchemaUtils.drop (Benutzer, Städte)
}
}Generiert SQL:
SQL: Tabelle erstellen, wenn nicht vorhanden ist Städte (ID int auto_increment, Name varchar (50) NICHT NULL, Einschränkung pk_cities_id Primärschlüssel (ID)))
SQL: Tabelle erstellen, wenn nicht existiert Benutzer (ID varchar (10), Name varchar (50) Null Null, City_id int Null, Einschränkung pk_user_id Primärschlüssel (ID), Einschränkung fk_users_city_id__id fremd key (City_id) Referenzen Städte (ID) auf Löschen des Einschränkungsabschlusss Auf Update einschränken)
SQL: In Städte (Name) Werte einfügen ('St. Petersburg')
SQL: In Städte (Name) Werte einfügen ('München')
SQL: In Städte (Name) Werte einfügen (Substring (Trim ('Prag'), 1, 2))
SQL: Select Cities.id, Städte.name aus Städten, in denen Städte = 3Paguename = pr
SQL: Einfügen in Benutzer (ID, Name, City_id) Werte ('Andrey', 'Andrey', 1)
SQL: In Benutzer (ID, Name, City_id) Werte einfügen ('Sergey', 'Sergey', 2)
SQL: In Benutzer (ID, Name, City_id) Werte ('Eugene', 'Eugene', 2) einfügen.
SQL: In Benutzer (ID, Name, City_id) Werte einfügen ('Alex', 'Alex', Null)
SQL: Einfügen in Benutzer (ID, Name, City_id) Werte ('Smth', 'etwas', null)
SQL: UPDATE Benutzer setzen name = 'Alexey', wobei Benutzer.id = 'Alex' SQL: Löschen von Benutzern, wo Benutzer.name wie '%Thing' alle Städte:
SQL: Select Cities.id, Städte.name aus Städten1: St. Petersburg2: München3: PR
Handbuch Join:
SQL: SELECT Users.name, cities = 'Sergey') und (user.city_id = cities.id)
Sergey lebt mit fremden Schlüssel in Münchenjoin:
SQL: SELECT Users.name, user.city_id, Cities.name von Benutzern innere Städte in Städten.id = user.city_id WHERE (Cities.name = 'St. Petersburg') oder (user.city_id is null)
Andrey lebt in St. Petersburg
Funktionen und Gruppe von:
SQL: Select Cities.name, count (user.id) aus Städten Inner -Join -Benutzer in Städten.ID = user.city_id Group von Städten ) in München
SQL: Droptabelle, wenn Benutzer vorhanden sind
SQL: Droptabelle, wenn Städte existiert import org.jetbrains.exposed.dao. .Transactions.TransactionObject Benutzer: intidentable () {val name = varchar ("name", 50) .Index () val City = Referenz ("Stadt", Städte) Val Age = Integer ("Alter")
} Objektstädte: intidTable () {val name = varchar ("name", 50)
} Klasse User (ID: EntityId <int>): Intentity (ID) {Begleitobjekt: IntentityClass <Unter> (Benutzer) VAR -Name von Benutzern
} Klasse City (ID: EntityId <int>): Intentity (ID) {Begleitobjekt: IntentityClass <City> (Städte) VAR -Name von Cities.nameval -Benutzer nach Benutzerverzählungsnutzern.City
} Fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", passwart = "")
Transaktion {
Addlogger (StDoutsQLlogger) SchemaUtilils.create (Städte, Benutzer) val stpete = City.new {
name = "St. Petersburg"} val munich = city.new {
name = "munich"} user.new {
name = "a" city = stpete
Alter = 5} user.new {
name = "b" City = STPETE
Alter = 27} user.new {
name = "c" Stadt = München
Alter = 42} println ("Städte: $ {City.All (). JointOstring {it.name}}") println ("Benutzer in $ {stpete.name}: $ {stpete.users.jointoString {it.name}} } ") println (" Erwachsene: $ {user.find {user.age größereq 18} .JointoString {it.name}} ")
}
}Generiert SQL:
SQL: Tabelle erstellen, wenn nicht vorhanden ist Städte (ID int auto_increment Primärschlüssel, Name Varchar (50) NICHT NULL)
SQL: Tabelle erstellen Wenn nicht existiert Benutzer BESCHRÄNKEN)
SQL: Erstellen Sie den Index user_name auf Benutzern (Name)
SQL: In Städte (Name) Werte einfügen ('St. Petersburg')
SQL: In Städte (Name) Werte einfügen ('München')
SQL: Wählen Sie Städte aus, Städte.name aus Städten
Städte: St. Petersburg, München
SQL: Einfügen in Benutzer (Name, Stadt, Alter) Werte ('A', 1, 5)
SQL: Einfügen in Benutzer (Name, Stadt, Alter) Werte ('B', 1, 27)
SQL: In Benutzer (Name, Stadt, Alter) Werte einfügen ('C', 2, 42)
SQL: Select users.id, user.name, user.city, user.age von user wobei Benutzer.city = 1User in St. Petersburg: A, B
SQL: Select users.id, user.name, user.city, user.age von Benutzern, wobei Benutzer.age> = 18Adults: b, cBitte beachten Sie den Beitragshandbuch, bevor Sie einen Beitrag leisten.
Durch den Beitrag zum exponierten Projekt stimmen Sie zu, dass Ihre Beiträge unter Apache -Lizenz, Version 2.0, lizenziert werden.