Skip to content

Everything Claude Code 的 kotlin-exposed-patterns Skill 是一套面向 Kotlin 项目的 JetBrains Exposed ORM 最佳实践集合,涵盖 DSL/DAO 查询模式、HikariCP 连接池、Flyway 迁移与仓储(Repository)模式。它让 AI 编程助手在数据库接入、表结构变更、事务安全、批量操作和测试隔离等环节实现自动化、标准化和高可维护性,显著减少人工踩坑与重复劳动,适合从初学者到深度定制场景。

Everything Claude Code Kotlin Exposed Patterns Skill:JetBrains Exposed DSL/DAO、HikariCP 与 Flyway 迁移

在使用 Claude Code、Codex、Cursor 等 AI 编程助手开发 Kotlin 后端时,数据库访问和迁移一直是高频、易出错的环节。kotlin-exposed-patterns Skill 针对 JetBrains Exposed ORM 的全栈用法,提供了从连接池配置、表定义、DSL/DAO 查询、事务隔离、批量操作到迁移与测试的完整模式集。相比手写 SQL 或零散配置,这一 Skill 能让你的 AI 助手输出高度一致、生产级的数据库代码,极大提升开发效率和代码质量。

本指南将从 Skill 的激活场景、操作流程、典型输出、与其他 Agent/Skill 的协作等维度,系统讲解如何用好 kotlin-exposed-patterns Skill。


1. 适用场景与激活条件

kotlin-exposed-patterns Skill 适用于以下场景:

  • 新建或重构 Kotlin 项目时,需要标准化数据库接入(PostgreSQL/MySQL/H2)。
  • 需要用 Exposed ORM 写类型安全的 SQL 查询,支持 DSL/DAO 双模式。
  • 希望自动生成 HikariCP 连接池配置,提升并发与资源利用率。
  • 需要 Flyway 迁移脚本管理数据库 schema 版本,保障上线平滑。
  • 采用 Repository 模式,解耦业务逻辑与数据访问,便于测试。
  • 涉及 JSONB 字段、复杂联表、批量插入、分页、聚合等高级用法。
  • 希望测试用例自动切换到 H2 内存库,实现无依赖、快速回归。

Skill 触发方式:

  • 在 Claude Code 等 AI 编程助手中,输入“用 Exposed 实现用户表 CRUD 并支持迁移”“帮我生成 Kotlin 的 Repository 模式数据库访问”“需要支持批量插入和分页”等需求时,Agent 会自动调用本 Skill,按最佳实践输出完整代码与配置。

2. Step by Step 操作流程

步骤 1:配置依赖与基础设施

首先,Skill 会为你补全所有必要依赖(build.gradle.kts):

kotlin
dependencies {
    implementation("org.jetbrains.exposed:exposed-core:1.0.0")
    implementation("org.jetbrains.exposed:exposed-dao:1.0.0")
    implementation("org.jetbrains.exposed:exposed-jdbc:1.0.0")
    implementation("com.zaxxer:HikariCP:6.2.1")
    implementation("org.flywaydb:flyway-core:10.22.0")
    implementation("org.postgresql:postgresql:42.7.5")
    testImplementation("com.h2database:h2:2.3.232")
}

自动生成 HikariCP 连接池工厂,并支持配置参数化:

kotlin
object DatabaseFactory {
    fun create(config: DatabaseConfig): Database {
        val hikariConfig = HikariConfig().apply {
            driverClassName = config.driver
            jdbcUrl = config.url
            username = config.username
            password = config.password
            maximumPoolSize = config.maxPoolSize
            isAutoCommit = false
            transactionIsolation = "TRANSACTION_READ_COMMITTED"
            validate()
        }
        return Database.connect(HikariDataSource(hikariConfig))
    }
}

步骤 2:生成 Flyway 迁移脚本与自动化迁移代码

Skill 会建议并自动生成 Flyway 迁移文件(如 V1__create_users.sql),并在应用启动时自动迁移:

kotlin
fun runMigrations(config: DatabaseConfig) {
    Flyway.configure()
        .dataSource(config.url, config.username, config.password)
        .locations("classpath:db/migration")
        .baselineOnMigrate(true)
        .load()
        .migrate()
}

迁移文件示例:

sql
-- src/main/resources/db/migration/V1__create_users.sql
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    role VARCHAR(20) NOT NULL DEFAULT 'USER',
    metadata JSONB,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

步骤 3:定义表结构与实体

Skill 会根据你的业务模型自动生成 Exposed 的 DSL Table 和 DAO Entity:

kotlin
object UsersTable : UUIDTable("users") {
    val name = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
    val role = enumerationByName<Role>("role", 20)
    val metadata = jsonb<UserMetadata>("metadata", Json.Default).nullable()
    val createdAt = timestampWithTimeZone("created_at").defaultExpression(CurrentTimestampWithTimeZone)
    val updatedAt = timestampWithTimeZone("updated_at").defaultExpression(CurrentTimestampWithTimeZone)
}
kotlin
class UserEntity(id: EntityID<UUID>) : UUIDEntity(id) {
    companion object : UUIDEntityClass<UserEntity>(UsersTable)
    var name by UsersTable.name
    var email by UsersTable.email
    var role by UsersTable.role
    // ...
}

步骤 4:生成 DSL/DAO 查询与批量操作代码

Skill 会根据需求自动选择 DSL(适合简单查询/批量)或 DAO(适合实体生命周期)输出:

DSL 查询示例:

kotlin
suspend fun findUserById(id: UUID): UserRow? =
    newSuspendedTransaction {
        UsersTable.selectAll()
            .where { UsersTable.id eq id }
            .map { it.toUser() }
            .singleOrNull()
    }

批量插入与 Upsert:

kotlin
suspend fun insertUsers(users: List<CreateUserRequest>): List<UUID> =
    newSuspendedTransaction {
        UsersTable.batchInsert(users) { user ->
            this[UsersTable.name] = user.name
            this[UsersTable.email] = user.email
            this[UsersTable.role] = user.role
        }.map { it[UsersTable.id].value }
    }

分页:

kotlin
suspend fun findUsersPaginated(page: Int, limit: Int): Page<UserRow> =
    newSuspendedTransaction {
        val total = UsersTable.selectAll().count()
        val data = UsersTable.selectAll()
            .orderBy(UsersTable.createdAt, SortOrder.DESC)
            .limit(limit)
            .offset(((page - 1) * limit).toLong())
            .map { it.toUser() }
        Page(data = data, total = total, page = page, limit = limit)
    }

步骤 5:事务与隔离级别管理

所有数据库操作自动包裹在 newSuspendedTransaction,支持协程与原子性,Skill 也会根据需求建议事务隔离级别:

kotlin
suspend fun readCommittedQuery(): List<User> =
    newSuspendedTransaction(transactionIsolation = Connection.TRANSACTION_READ_COMMITTED) {
        UserEntity.all().map { it.toModel() }
    }

步骤 6:仓储(Repository)模式与测试隔离

Skill 会自动生成 Repository 接口及实现,便于业务层解耦和单元测试:

kotlin
interface UserRepository {
    suspend fun findById(id: UUID): User?
    // ...
}
kotlin
class ExposedUserRepository(private val database: Database) : UserRepository {
    override suspend fun findById(id: UUID): User? =
        newSuspendedTransaction(db = database) {
            UsersTable.selectAll()
                .where { UsersTable.id eq id }
                .map { it.toUser() }
                .singleOrNull()
        }
}

测试时自动切换到 H2 内存库,保证测试无副作用:

kotlin
database = Database.connect(
    url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=PostgreSQL",
    driver = "org.h2.Driver",
)

3. 典型输出与预期效果

  • 自动生成迁移文件、表定义、DSL/DAO 查询、批量操作、分页、聚合、事务与仓储实现,代码风格统一、健壮。
  • 所有数据库操作都支持协程与事务隔离,避免并发和一致性问题。
  • 测试用例无需真实数据库,自动用 H2 内存库隔离,回归快、易维护。
  • 支持 JSONB 字段、复杂联表、批量插入、Upsert 等高级场景。
  • 迁移、连接池、表结构、数据访问、测试全流程自动化,极大减少人工配置和踩坑。

4. 常见配套 Agent/Skill 与协作关系

  • Kotlin Build Resolver Agent:遇到 Exposed/HikariCP/Flyway 相关构建或依赖问题时自动修复,保障 Skill 代码可用。Kotlin Build Resolver Agent
  • Database Reviewer Agent:对生成的表结构、索引、SQL 查询做安全与性能审查,发现潜在问题并给出优化建议。Database Reviewer Agent
  • Database Migrations Skill:与本 Skill 协同,统一管理多语言、多数据库的迁移规范。Database Migrations Skill
  • Verification Loop Skill:用端到端验证循环自动检查迁移、数据访问、测试用例的正确性。Verification Loop Skill

更多整体用法可参考 Everything Claude Code 完全指南Claude Code 快速上手指南


FAQ

Q: 这个 Skill 支持哪些数据库? A: 默认支持 PostgreSQL、H2(测试),也可适配 MySQL 等主流关系型数据库。

Q: 如何在已有项目中集成? A: 只需补全依赖、迁移配置和表定义,AI 助手会自动检测并生成兼容代码,无需手动迁移现有数据。

Q: 可以和 Spring Boot、Ktor 等框架一起用吗? A: 完全可以,Skill 生成的代码与主流 Kotlin 后端框架兼容,可按需集成到现有模块。