Appearance
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 后端框架兼容,可按需集成到现有模块。