Kotlin und PostgreSQL: Ein unerwartetes Duo für Ihr Backend
\n\nWenn es um moderne Backend-Entwicklung geht, werden Kotlin und PostgreSQL immer häufiger in einem Satz genannt. Und das ist kein Zufall. Kotlin bringt Prägnanz und funktionale Features in die JVM-Welt, während PostgreSQL der Maßstab für Zuverlässigkeit und Flexibilität unter den relationalen Datenbanken bleibt. In diesem Leitfaden werden wir uns ansehen, wie man diese beiden Technologien verbindet, echten Code schreibt und bewährte Praktiken betrachtet.
\n\nEgal, ob Sie bereits mit Kotlin für das Backend vertraut sind oder gerade erst anfangen – dieser Artikel gibt Ihnen einen klaren Aktionsplan. Los geht's!
\n\nWarum Kotlin + PostgreSQL großartig ist?
\n\nKotlin ist eine Sprache, in die man sich ab der ersten Zeile verliebt. Sie ist kompatibel mit Java, erspart aber Tonnen von Boilerplate-Code. Und PostgreSQL ist nicht nur eine "weitere Datenbank". Es ist ein leistungsstarkes Werkzeug mit Unterstützung für JSON, Volltextsuche, Fensterfunktionen und Erweiterungen wie PostGIS.
\n\nZusammen bieten sie:
\n- \n
- Null-Sicherheit auf Typebene – Kotlin schützt Sie vor NPE bei der Arbeit mit Abfrageergebnissen. \n
- Asynchronität von Haus aus – Kotlin-Coroutinen eignen sich ideal für die Arbeit mit Verbindungspools. \n
- DSL für SQL – Bibliotheken wie Exposed ermöglichen es, Abfragen als Teil der Sprache zu schreiben. \n
- Leistung – JVM + optimierter JDBC-Treiber bieten hervorragende Geschwindigkeit. \n
Umgebungsvorbereitung: Was installiert werden muss
\n\nBevor Sie Code schreiben, stellen Sie sicher, dass Sie Folgendes haben:
\n- \n
- Installiertes JDK 17+ \n
- IntelliJ IDEA (Community Edition reicht aus) \n
- PostgreSQL 14+ (möglich über Docker:
docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres) \n - Grundlegendes Verständnis von SQL \n
Erstellen Sie ein neues Gradle-Projekt in IntelliJ. Fügen Sie in build.gradle.kts die Abhängigkeiten hinzu:
dependencies {\n implementation("org.jetbrains.exposed:exposed-core:0.44.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.44.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1")\n implementation("org.postgresql:postgresql:42.7.1")\n implementation("com.zaxxer:HikariCP:5.1.0")\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")\n}\n\nVerbindung zu PostgreSQL über HikariCP
\n\nFür die Arbeit mit PostgreSQL in Kotlin benötigen wir einen Verbindungspool. HikariCP ist der De-facto-Standard. Er ist schnell, leichtgewichtig und in wenigen Zeilen konfiguriert.
\n\nErstellen wir eine Klasse DatabaseFactory:
import com.zaxxer.hikari.HikariConfig\nimport com.zaxxer.hikari.HikariDataSource\nimport org.jetbrains.exposed.sql.Database\n\nobject DatabaseFactory {\n fun init() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://localhost:5432/yourdb"\n driverClassName = "org.postgresql.Driver"\n username = "postgres"\n password = "pass"\n maximumPoolSize = 10\n isAutoCommit = false\n transactionIsolation = "TRANSACTION_REPEATABLE_READ"\n }\n\n val dataSource = HikariDataSource(config)\n Database.connect(dataSource)\n }\n}\n\nBeachten Sie: isAutoCommit = false gibt uns die Kontrolle über Transaktionen. Dies ist wichtig für die Datenkonsistenz.
Erstellen von Tabellen mit Exposed ORM
\n\nExposed ist ein leichtgewichtiger ORM für Kotlin, der keine eigenen Regeln aufzwingt. Sie können sowohl mit dem DSL als auch mit DAO-Objekten arbeiten.
\n\nDefinieren wir ein Benutzermodell:
\n\nimport org.jetbrains.exposed.sql.Table\n\nobject Users : Table("users") {\n val id = integer("id").autoIncrement()\n val name = varchar("name", 100)\n val email = varchar("email", 255).uniqueIndex()\n val