【Spring Boot】JDBC Template の基本をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot では、
Spring Data JPA を使うと DB アクセスがとても簡単になります。

でも、実務ではこんな場面があります。

  • 複雑な SQL を自分で書きたい
  • パフォーマンスのために SQL を最適化したい
  • JOIN や集計を細かく制御したい
  • JPA では書きにくいクエリを使いたい

そんなときに役立つのが
JDBC Template(JdbcTemplate) です。

この記事では、JdbcTemplate の基本を
やさしく・実務寄り で整理していきます。


JDBC Template とは

一言でいうと、

「SQL を自分で書きつつ、面倒な処理は Spring がやってくれる仕組み」

です。

  • コネクション取得
  • PreparedStatement の生成
  • リソース解放
  • 例外処理

こういった“面倒な部分”を Spring が全部やってくれます。


まずは基本のコードを確認

Repository クラス

Java
@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(複数件取得)

Java
jdbcTemplate.query(sql, rowMapper);

queryForObject(1件取得)

Java
jdbcTemplate.queryForObject(sql, rowMapper, id);

update(INSERT / UPDATE / DELETE)

Java
jdbcTemplate.update("INSERT INTO users(name, age) VALUES (?, ?)", name, age);

queryForList(単純なリスト)

Java
jdbcTemplate.queryForList("SELECT name FROM users", String.class);

RowMapper を使ってオブジェクトに変換する

Java
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 を使う

Java
SELECT * FROM users WHERE name = :name

のように名前付きパラメータが使える。

RowMapper を共通化する

複数のクエリで使い回せる。

SQL を外部ファイルに切り出す

SQL が増えたら管理が楽になる。


まとめ

JdbcTemplate は、

「SQL を自分で書きたいときの強力な選択肢」

です。

  • SQL を完全にコントロールできる
  • パフォーマンスチューニングに強い
  • JPA と併用できる
  • RowMapper で柔軟にオブジェクト変換
  • update / query / queryForObject が基本

難しく聞こえますが、
「SQL を書きたいときに使う」
と理解できれば十分です。


decopon
decopon

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

moco
moco

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

コメント

タイトルとURLをコピーしました