はじめに
Spring Boot では、
Spring Data JPA を使うと DB アクセスがとても簡単になります。
でも、実務ではこんな場面があります。
- 複雑な SQL を自分で書きたい
- パフォーマンスのために SQL を最適化したい
- JOIN や集計を細かく制御したい
- JPA では書きにくいクエリを使いたい
そんなときに役立つのが
JDBC Template(JdbcTemplate) です。
この記事では、JdbcTemplate の基本を
やさしく・実務寄り で整理していきます。
JDBC Template とは
一言でいうと、
「SQL を自分で書きつつ、面倒な処理は Spring がやってくれる仕組み」
です。
- コネクション取得
- PreparedStatement の生成
- リソース解放
- 例外処理
こういった“面倒な部分”を Spring が全部やってくれます。
まずは基本のコードを確認
Repository クラス
@Repository
public class UserJdbcRepository {
private final JdbcTemplate jdbcTemplate;
public UserJdbcRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findAll() {
String sql = "SELECT id, name, age FROM users";
return jdbcTemplate.query(sql, (rs, rowNum) ->
new User(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("age")
)
);
}
}ポイント
- SQL は自分で書く
- query() で結果をリストに変換
- RowMapper(ラムダ)で Entity に変換
JPA より“素の SQL に近い”書き方です。
JdbcTemplate のよく使うメソッド
query(複数件取得)
jdbcTemplate.query(sql, rowMapper);queryForObject(1件取得)
jdbcTemplate.queryForObject(sql, rowMapper, id);update(INSERT / UPDATE / DELETE)
jdbcTemplate.update("INSERT INTO users(name, age) VALUES (?, ?)", name, age);queryForList(単純なリスト)
jdbcTemplate.queryForList("SELECT name FROM users", String.class);RowMapper を使ってオブジェクトに変換する
例
RowMapper<User> mapper = (rs, rowNum) ->
new User(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("age")
);RowMapper を使うことで、
SQL → Java オブジェクト の変換を柔軟にできます。
JdbcTemplate を使うメリット
SQL を完全にコントロールできる
JPA では書きにくいクエリも自由自在。
パフォーマンスチューニングがしやすい
SQL を最適化したいときに便利。
DB の機能をフル活用できる
- ヒント句
- 特殊な JOIN
- DB 固有の関数
なども使えます。
JPA と併用できる
Repository の一部だけ JdbcTemplate にすることも可能。
JdbcTemplate を使うデメリット
1. SQL を自分で書く必要がある
JPA よりコード量が増える。
2. メンテナンスが大変
SQL が増えると管理が難しくなる。
3. DB 依存が強くなる
移植性は JPA より低い。
実務での使い分け
JPA を使うべき場面
- CRUD
- 単純な検索
- Entity を中心に扱う処理
JdbcTemplate を使うべき場面
- 複雑な SQL
- パフォーマンスが重要
- 集計・分析系のクエリ
- DB 固有の機能を使いたい
“JPA で書けるところは JPA、難しいところだけ JdbcTemplate”
という使い分けが実務では多いです。
よくあるつまずきポイント
SQL のスペルミス
JPA と違って SQL は完全に自分で書くため、ミスしやすい。
カラム名の間違い
rs.getString(“namee”) のようなミス。
RowMapper の変換ミス
型が合わないと例外が出る。
DB が起動していない
JPA と同じく DataSource の設定ミス。
JdbcTemplate をもっと活かすポイント
NamedParameterJdbcTemplate を使う
SELECT * FROM users WHERE name = :nameのように名前付きパラメータが使える。
RowMapper を共通化する
複数のクエリで使い回せる。
SQL を外部ファイルに切り出す
SQL が増えたら管理が楽になる。
まとめ
JdbcTemplate は、
「SQL を自分で書きたいときの強力な選択肢」
です。
- SQL を完全にコントロールできる
- パフォーマンスチューニングに強い
- JPA と併用できる
- RowMapper で柔軟にオブジェクト変換
- update / query / queryForObject が基本
難しく聞こえますが、
「SQL を書きたいときに使う」
と理解できれば十分です。

JdbcTemplate を理解すると、
JPA では書きにくいクエリも自由に扱えるようになります。
“JPA と SQL のいいとこ取り” ができるようになると、
DB アクセスの幅がぐっと広がります。
あなたの開発が、今日より少しだけ楽になりますように。

SQL をそのまま書けるって、なんだか素直でかわいいね…

コメント