Kotlin和PostgreSQL:比您想象的更快地编写后端

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin和PostgreSQL:您后端的意外组合



当谈到现代后端开发时,Kotlin和PostgreSQL越来越频繁地出现在同一句话中。这并非偶然。Kotlin为JVM世界带来了简洁性和函数式特性,而PostgreSQL在关系型数据库中仍然是可靠性和灵活性的典范。在本指南中,我们将探讨如何让这两种技术协同工作,编写真实代码,并研究最佳实践。



无论您已经熟悉Kotlin后端开发,还是刚刚开始——本文都将为您提供清晰的行动计划。我们开始吧!



为什么Kotlin + PostgreSQL很棒?



Kotlin是一种让人从第一行代码就爱上的语言。它与Java兼容,同时消除了大量样板代码。而PostgreSQL不仅仅是“另一个数据库”。它是一个强大的工具,支持JSON、全文搜索、窗口函数以及PostGIS等扩展。



它们共同提供了:

  • 类型级别的空安全——Kotlin在处理查询结果时保护您免受NPE(空指针异常)的影响。
  • 开箱即用的异步支持——Kotlin协程非常适合处理连接池。
  • SQL的DSL(领域特定语言)——像Exposed这样的库允许您将查询作为语言的一部分来编写。
  • 性能——JVM加上优化的JDBC驱动程序提供了出色的速度。


环境准备:需要安装什么



在编写代码之前,请确保您已具备:

  • 已安装JDK 17+
  • IntelliJ IDEA(社区版即可)
  • PostgreSQL 14+(可以通过Docker安装:docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres)
  • 基本的SQL知识


在IntelliJ中创建一个新的Gradle项目。在build.gradle.kts中添加依赖项:



dependencies {    implementation("org.jetbrains.exposed:exposed-core:0.44.1")    implementation("org.jetbrains.exposed:exposed-dao:0.44.1")    implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1")    implementation("org.postgresql:postgresql:42.7.1")    implementation("com.zaxxer:HikariCP:5.1.0")    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")}


通过HikariCP连接PostgreSQL



为了在Kotlin中使用PostgreSQL,我们需要一个连接池。HikariCP是事实上的标准。它快速、轻量,并且只需几行代码即可配置。



创建一个DatabaseFactory类:



import com.zaxxer.hikari.HikariConfigimport com.zaxxer.hikari.HikariDataSourceimport org.jetbrains.exposed.sql.Database

object DatabaseFactory { fun init() { val config = HikariConfig().apply { jdbcUrl = "jdbc:postgresql://localhost:5432/yourdb" driverClassName = "org.postgresql.Driver" username = "postgres" password = "pass" maximumPoolSize = 10 isAutoCommit = false transactionIsolation = "TRANSACTION_REPEATABLE_READ" }

val dataSource = HikariDataSource(config) Database.connect(dataSource) }}


请注意:isAutoCommit = false让我们能够控制事务。这对于数据一致性很重要。



使用Exposed ORM创建表



Exposed是一个轻量级的Kotlin ORM,它不强加自己的规则。您既可以使用DSL,也可以使用DAO对象。



定义用户模型:



import org.jetbrains.exposed.sql.Table

object Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 100) val email = varchar("email", 255).uniqueIndex() val

博客

书籍推荐