
kotlin-exposed-patternsでKotlinのDB処理を整える
cccskills 編集部読了 約 10 分
この記事の結論
- こんな人に
- KotlinでサーバーサイドのDB処理を書いていて、JetBrains Exposedのクエリや接続設定、テストの書き方に迷っている開発者
- 入れると
- 「ユーザー検索とページ分割を」と頼むと、トランザクション付きのExposedコードが返ってくる
- HikariCPの接続プールとFlywayのマイグレーションを、起動処理まで含めて一式で用意できる
- データアクセスをインターフェースで分け、H2のメモリ上DBで動くテストまで書かせられる
- 向かない人
- Exposed以外のORMを使う人や、PostgreSQL以外のデータベース向けの設定例が必要な人
Kotlinでサーバーサイドを書くなら、kotlin-exposed-patternsを入れると、JetBrains Exposedのクエリからテストまでをエージェントが一貫した書き方で提案してくれます。この記事で扱うのは、スキルが扱う範囲、Claude CodeやCodexへの入れ方、実際に送る依頼文の例です。使う前に確かめておきたい点も順に説明します。
目次
使うとこうなる
kotlin-exposed-patternsを入れると、エージェントはExposedのコードを毎回同じ型で組み立てるようになります。たとえば次のように頼んだとしましょう。
Exposedでユーザー検索とページ分割を実装して
エージェントはテーブル定義、検索関数、ページ情報を持つデータクラスをまとめて返します。各関数はnewSuspendedTransactionのブロックで囲まれ、コルーチン(Kotlinの非同期処理の仕組み)の中でも安全に動く形です。検索語はLIKEの特殊文字をエスケープしてから使うため、利用者の入力で意図しない一致が起きません。
ページ分割の結果は、次の項目を持つPageクラスで受け取ります。
| 項目 | 内容 |
|---|---|
data | そのページのレコード一覧 |
total | 全体の件数 |
page / limit | 現在のページ番号と1ページの件数 |
totalPages | 総ページ数 |
hasNext / hasPrevious | 次・前のページがあるか |
このスキルはGitHubのaffaan-m/ECCで公開されていて、リポジトリのスターは288823です。中身はSKILL.mdの1ファイルで、ユーザーと注文を題材にしたコード例が中心になっています。
kotlin-exposed-patternsでできること
このスキルは、Exposedでのデータアクセスを4つの面から支えます。「クエリ」「接続と構造変更」「トランザクション」「分離とテスト」です。エージェントはこれらの例を手元のテーブルに当てはめてコードを書きます。
検索・更新クエリをDSLとDAOで書く
Exposedには2つの書き方があり、スキルは両方の例を載せています。使い分けの目安は次のとおりです。
| 書き方 | 特徴 | 向く場面 |
|---|---|---|
| DSL | SQLに近い式で書く | 単純な検索や更新 |
| DAO | レコードをオブジェクトとして扱う | 作成・更新などエンティティの状態を管理したいとき |
DSLの例は、登録・取得・更新・削除の基本操作から、テーブル結合・集計・サブクエリ・ページ分割までそろっています。複数件をまとめて入れるbatchInsertや、重複時に更新へ切り替えるupsertも対象です。PostgreSQLのJSONB列をkotlinx.serializationで読み書きする列型の定義も含まれます。
接続の再利用と構造変更を管理する
接続まわりは、HikariCPのコネクションプール(接続を使い回す仕組み)とFlywayのマイグレーションを組み合わせる構成です。HikariCPでは最大接続数、自動コミットの無効化、分離レベルREAD_COMMITTEDを指定します。Flywayはアプリの起動時に、番号付きのSQLファイルを順に適用してテーブル構造をそろえます。
マイグレーションのSQLは、src/main/resources/db/migration/にV1__create_users.sqlのような名前で置く形です。起動処理では、マイグレーションを先に実行してから接続プールを作ります。
トランザクションで処理をまとめる
**すべてのデータベース操作をnewSuspendedTransactionのブロック内で実行するのが、このスキルの原則です。**ブロック内の処理は、まとめて成功するか、まとめて失敗します。送金のように2件の更新を同時に通したい場面の例や、SERIALIZABLEなど分離レベルを変える例もあります。
データアクセスを分けてテストする
業務処理とデータアクセスを切り離すために使うのが、リポジトリパターン(データの出し入れを1つの窓口にまとめる設計)です。UserRepositoryというインターフェースに検索・作成・更新・削除・件数取得を定義し、Exposedでの実装クラスを別に用意する形です。テストではH2のメモリ上データベースをPostgreSQL互換モードで起動し、実装クラスをそのまま検証します。
テスト例は3つあります。作成したユーザーを取得できるか、未登録のメールでnullが返るか、25件を10件ずつ分けたページ情報が正しいかの確認です。各テストの前にテーブルを空にするので、テスト同士が影響し合いません。
インストール方法
インストールは、コマンドで入れる方法とエージェントに頼む方法の2通りです。コマンドを実行すると、Claude CodeやCodexなど入れる先のエージェントを選べます。
npx skills add https://github.com/affaan-m/ECC --skill kotlin-exposed-patterns
エージェントに任せる場合は、次の文面をそのまま送ってください。中身の確認から配置までをまとめて頼む内容です。
次の Agent Skill をインストールしてください。
https://github.com/affaan-m/ECC/tree/main/skills/kotlin-exposed-patterns
まず SKILL.md と付属ファイルの中身を確認し、不審な処理(外部への送信、認証情報の読み取りなど)がないことを確かめてから、Claude Code なら ~/.claude/skills/kotlin-exposed-patterns/、Codex なら ~/.agents/skills/kotlin-exposed-patterns/ に配置してください。
置き場所は、エージェントの種類とスキルを使う範囲で決まります。
| エージェント | すべてのプロジェクトで使う | 特定のプロジェクトだけで使う |
|---|---|---|
| Claude Code | ~/.claude/skills/ | プロジェクトの.claude/skills/ |
| Codex | ~/.agents/skills/ | プロジェクトの.agents/skills/ |
Exposedを使うプロジェクトが1つだけなら、プロジェクト側に置く方法が向いています。
使い方の例
依頼文には、テーブルの中身や接続先など手元の条件を添えてください。そうすると、返ってくるコードがその条件に沿ったものになります。
PostgreSQLにつなぐ接続設定をHikariCPとFlywayで作って。プールの最大数は10にして
返ってくるのは、接続情報をまとめるデータクラス、HikariCPからExposedのDatabaseを作るファクトリー、Flywayを実行する関数です。最初のマイグレーションSQLと、起動時にマイグレーションを実行してから接続する処理も付きます。
注文テーブルを追加して、指定したユーザーの注文を新しい順に一覧で取る処理を書いて
ユーザーテーブルを参照する注文テーブルの定義と、2つのテーブルをinnerJoinで結合する検索関数が返ります。並び順は作成日時の降順です。スキルの例に沿うと、結果は注文ID・状態・金額・ユーザー名を持つデータクラスに詰められます。
データアクセスをインターフェースで分離し、H2でテストして
そろうのは、リポジトリのインターフェース、Exposedでの実装クラス、H2を使うテストコードの3点です。テストはFunSpec形式で、各テストの前にテーブルを空にする処理が入ります。
注意点
このスキルはパターン集なので、バージョンや接続先はプロジェクトに合わせて自分で確かめる必要があります。資料のGradle設定は次のバージョンを前提にしています。
| ライブラリ | 資料のバージョン |
|---|---|
| Exposed(core、dao、jdbc、kotlin-datetime、json) | 1.0.0 |
| PostgreSQLドライバー | 42.7.5 |
| HikariCP | 6.2.1 |
| Flyway(core、database-postgresql) | 10.22.0 |
| H2(テスト用) | 2.3.232 |
手元のバージョンが違う場合は、依頼文でバージョンを伝えてから書かせてください。生成されたコードは、ビルドとテストを通してから取り込むのが安全です。
**設定例とSQLはPostgreSQLを前提にしています。**JSONB列やgen_random_uuid()による主キーの生成、PGobjectを使った変換は、PostgreSQL固有の書き方です。ほかのデータベース製品向けの設定例はスキルに含まれていません。
接続先のURL・ドライバー・ユーザー名・パスワードは、自分の環境に合わせて用意します。スキルの例では、これらをアプリの設定ファイルから読み込む形です。認証情報をコードに直接書かないよう気をつけてください。
ライセンスはMITで、含まれるファイルはSKILL.mdだけです。スクリプトは入っていません。それでも、入れる前にSKILL.mdを開いて内容を一度確認しておくと安心です。
まとめ
kotlin-exposed-patternsは、JetBrains Exposedを使ったKotlinのデータベース処理を、クエリからテストまで1つの型にそろえるためのスキルです。対象はDSLとDAOのクエリ、HikariCPとFlywayの接続設定、リポジトリの分離とH2でのテストです。どれもエージェントが同じパターンで提案できるようになります。PostgreSQLとExposedでサーバーサイドを書いている人ほど、そのまま使える部分が多いスキルです。インストール先や紹介文はcccskillsのページで確認できます。
よくある質問
- DSLとDAOのどちらで書けばよいですか
- 単純な検索や更新はDSL、レコードをオブジェクトとして作成・更新しながら扱いたいときはDAOが目安です。スキルもこの使い分けを勧めています。
- MySQLなどPostgreSQL以外でも使えますか
- スキルの設定例とSQLはPostgreSQL向けで、ほかの製品の手順は載っていません。Exposedの書き方そのものは参考になります。ただし、ドライバーやデータベース固有の部分は自分で調べる必要があります。
- テスト用のデータベースサーバーを別に用意する必要はありますか
- スキルのテスト例は、H2のメモリ上データベースをPostgreSQL互換モードで動かす形です。テスト開始時にテーブルを作り、各テストの前に中身を消す流れなので、外部のデータベースサーバーは使いません。
このスキルを試す
kotlin-exposed-patterns の入れ方とインストールコマンドは、cccskills のスキルページにまとめてあります。
この記事は、公開されている SKILL.md と cccskills の紹介文をもとに AI(Claude)が下書きし、cccskills 編集部の方針に沿って推敲・公開しています。正確な仕様はスキルのページで原文を確認してください。
- Kotlin Exposed
- JetBrains Exposed 使い方
- Kotlin データベース
- Kotlin ORM
- Exposed トランザクション
- Kotlin コネクションプール
- Kotlin リポジトリパターン
- Kotlin マイグレーション Flyway
他の記事

OpenClawのQAシナリオを回す openclaw-qa-testing
OpenClawのQAシナリオを模擬環境や実サービスで実行し、失敗原因の修正と再実行、レポート確認、複数モデルの話し方の比較、OpenTelemetryの追跡データ検証までエージェントに任せる方法とインストール手順を解説します。
openclaw-qa-testingopenclaw

chief-of-staffでサブエージェントを束ねて長期目標を進める
chief-of-staffを入れると、長期目標をひとつのセッションで追い、作業をサブエージェントに任せながら対話を続けられます。Wikiへの記録、規約や作業環境の改善提案、インストール手順と依頼文の例まで解説します。
chief-of-staffmattpocock

テスト失敗を並行で直す「dispatching-parallel-agents」
dispatching-parallel-agentsは、原因の違うテスト失敗や不具合を別々のサブエージェントに割り当て、並行で直すためのスキルです。独立性の見極め方、担当への指示の書き方、修正の統合手順とインストール方法を解説します。
dispatching-parallel-agentsobra