カテゴリ: Spring 更新日: 2025/09/26

INSERT文でデータを登録する処理の書き方!Spring JDBCでSQLを使った初心者向け解説

INSERT文でデータを登録する処理の書き方
INSERT文でデータを登録する処理の書き方

新人と先輩の会話形式で理解しよう

新人

「Springでデータベースに情報を登録するにはどうすればいいんでしょうか?」

先輩

「その場合は、INSERT文を使ってSQLでデータ登録を行います。Spring JDBCのJdbcTemplateを使えば簡単に実装できますよ。」

新人

INSERT文って具体的にはどう書くんですか?あと、JdbcTemplateの使い方も知りたいです!」

先輩

「それじゃあ、INSERT文の基本と、Spring JDBCでの使い方を順番に見ていこうか!」

1. INSERT文とは?(SQLの基本構文)

1. INSERT文とは?(SQLの基本構文)
1. INSERT文とは?(SQLの基本構文)

INSERT文は、データベースに新しいデータを登録するためのSQL文です。例えば、社員情報や商品情報などの新しいレコードをテーブルに追加する際に使用されます。

SQLにおけるINSERT文の基本構文は以下のようになります。


INSERT INTO テーブル名 (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);

具体的な例として、社員テーブルemployeesに名前とメールアドレスを登録する場合、次のように記述します。


INSERT INTO employees (name, email)
VALUES ('田中太郎', 'tanaka@example.com');

このように、INSERT文を使えば簡単にデータを追加できます。複数レコードを一括で登録することも可能です。

ただし、SQLの構文ミスやデータ型の不一致があるとエラーになるので、しっかりと確認しながら記述することが重要です。

2. Spring JDBCにおけるINSERT文の使い方と役割

2. Spring JDBCにおけるINSERT文の使い方と役割
2. Spring JDBCにおけるINSERT文の使い方と役割

次に、SpringフレームワークでINSERT文を使ってデータ登録する方法を見ていきましょう。Spring JDBCではJdbcTemplateクラスを使ってSQLを実行します。

まず、設定ファイルでDataSourceJdbcTemplateを定義しておきます。今回は、Gradleを使ったプロジェクトで、設定済みであることを前提とします。

Springの@Controllerを使って、画面入力から受け取ったデータをINSERT文で登録する処理は以下のように実装します。


@Controller
public class EmployeeController {

    private final JdbcTemplate jdbcTemplate;

    public EmployeeController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @PostMapping("/register")
    public String registerEmployee(@RequestParam String name, @RequestParam String email) {
        String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, name, email);
        return "result";
    }
}

このコードでは、HTMLフォームからnameemailを受け取り、JdbcTemplateupdateメソッドを使ってINSERT文を実行しています。

ポイントは以下の3つです:

  • SQLに「?」を使ってプレースホルダーを記述する
  • updateメソッドでSQL文と値を引数に渡す
  • @Controller@PostMappingでフォーム送信に対応する

このように、Spring JDBCを使えば、SQLを直接書いてデータベースにINSERTできる柔軟な設計が可能です。

また、JdbcTemplateは内部的に例外処理や接続のクローズ処理なども行ってくれるため、初心者にも扱いやすいのが特徴です。

さらに、トランザクション処理やバリデーションを組み合わせれば、業務アプリケーションでも安心して使えるデータ登録処理を構築できます。

今後は、フォーム側のHTML記述や、バリデーションの追加、登録後のリダイレクトなどの処理もあわせて学習していくと、より実践的なアプリケーションを作れるようになります。

3. JdbcTemplateのupdateメソッドの基本的な使い方

3. JdbcTemplateのupdateメソッドの基本的な使い方
3. JdbcTemplateのupdateメソッドの基本的な使い方

JdbcTemplateupdateメソッドは、SQL登録などのデータ変更を伴う処理で使用されます。特にINSERT文の実行では、このupdateメソッドが中心となります。

基本的な使い方はとてもシンプルで、以下のようにSQL文とパラメータを渡すことで実行されます。


String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, "佐藤花子", "sato@example.com");

ここで重要なのは、SQL内に直接値を埋め込まないということです。代わりに?でプレースホルダーを使い、値は別で渡します。これにより、SQLインジェクション対策にもつながります。

また、updateメソッドは、更新されたレコード数(登録件数)を返してくれるので、処理が成功したかどうかの判断にも使えます。


int result = jdbcTemplate.update(sql, "佐藤花子", "sato@example.com");
if (result > 0) {
    System.out.println("データ登録に成功しました");
}

このように、updateメソッドを使えばINSERT文によるSQL登録が簡単にできます。

4. 実際のINSERT文を使ったサンプルコード

4. 実際のINSERT文を使ったサンプルコード
4. 実際のINSERT文を使ったサンプルコード

ここでは、Springの@Controllerを使って、実際に画面からデータを受け取り、INSERT文で登録する一連の流れをサンプルコードで見ていきます。

下記は、社員情報(氏名・メールアドレス)を受け取ってデータベースにSQL登録する処理です。


@Controller
public class RegisterController {

    private final JdbcTemplate jdbcTemplate;

    public RegisterController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @GetMapping("/form")
    public String showForm() {
        return "form";
    }

    @PostMapping("/submit")
    public String submitForm(@RequestParam String name, @RequestParam String email) {
        String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
        int result = jdbcTemplate.update(sql, name, email);
        if (result > 0) {
            return "success";
        } else {
            return "error";
        }
    }
}

このコードでは、GETでフォーム画面を表示し、POSTで入力された情報をINSERT文として処理しています。

JdbcTemplateupdateメソッドは、パラメータの数や型が一致していれば自動的にSQLを構築してくれるため、とても便利です。

登録に成功したかどうかはupdateの戻り値で確認できるため、登録結果に応じて遷移先を変えることもできます。

5. プレースホルダとバインド変数を使った安全な書き方

5. プレースホルダとバインド変数を使った安全な書き方
5. プレースホルダとバインド変数を使った安全な書き方

プレースホルダとは、SQL文の中に「?」という形で値の入る場所を定義しておき、後から値を渡す書き方のことです。

この書き方のメリットは大きく3つあります。

  • SQLインジェクション対策ができる
  • コードの可読性が高くなる
  • 値の型に応じて自動で処理される

たとえば、次のようなコードでは、nameemailの値がバインド変数として安全に処理されます。


String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, name, email);

このとき、nameemailの値が仮にユーザー入力によって悪意のある文字列になっていたとしても、SQL構文として実行されることはありません。

例えば、以下のような危険な入力があったとしましょう。


' OR '1'='1

これはSQLインジェクションの代表例ですが、プレースホルダでの記述を使っていれば、安全に値として処理され、テーブル全体のデータが破壊されるような危険は回避できます。

また、Spring JDBCではPreparedStatementを内部で使ってくれるため、SQLの組み立てを自分で書かなくても安全にINSERT文を実行できます。

このように、プレースホルダとバインド変数の組み合わせは、セキュリティ面でもパフォーマンス面でも非常に優れた設計です。

初心者の方でも、必ずJdbcTemplateupdateメソッドを使うときには、プレースホルダで記述するように意識しておきましょう。

最後に、もう一度基本的な形を確認しておきましょう。


String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, "山田太郎", "yamada@example.com");

このように書けば、SQLのINSERT文を安全に実行でき、アプリケーションの品質も向上します。

6. INSERT処理でよくあるエラーとその対処法

6. INSERT処理でよくあるエラーとその対処法
6. INSERT処理でよくあるエラーとその対処法

INSERT文によるデータベース登録では、実行時にさまざまなエラーが発生することがあります。初心者の方がつまずきやすいポイントをいくつか紹介し、それぞれのエラー処理方法を解説します。

主なエラーとその原因

  • SQL構文エラー:カラム名のスペルミスやカンマの抜けなど
  • Null制約違反:必須項目にnullを入れてしまった場合
  • 一意制約違反:メールアドレスなどの重複を許さないカラムに重複データを登録しようとした場合
  • データ型の不一致:文字列を数値カラムに入れた場合など

このようなエラーが発生すると、JdbcTemplateは例外をスローします。対処法としてはtry-catchDataAccessExceptionを捕捉し、適切な処理を行うことが一般的です。


try {
    String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
    jdbcTemplate.update(sql, name, email);
} catch (DataAccessException e) {
    System.out.println("データベース登録時にエラーが発生しました: " + e.getMessage());
}

これにより、エラーが発生してもアプリケーションが停止せず、エラー内容の確認やログ出力が可能になります。

特に商用アプリケーションでは、ユーザーに不快なエラー画面を見せないように、エラーメッセージを制御することも大切です。

7. データ登録処理をDAOやServiceクラスに分けて再利用する方法

7. データ登録処理をDAOやServiceクラスに分けて再利用する方法
7. データ登録処理をDAOやServiceクラスに分けて再利用する方法

INSERT文を使ったデータベース登録の処理は、@Controllerにすべて書くのではなく、責任を分離するためにDAOServiceに分けるのが望ましいです。

このように役割を分けることで、コードが読みやすくなり、再利用単体テストもしやすくなります。

以下は、EmployeeDaoというクラスを使ってINSERT処理を分離した例です。


@Repository
public class EmployeeDao {

    private final JdbcTemplate jdbcTemplate;

    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public int insert(String name, String email) {
        String sql = "INSERT INTO employees (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, name, email);
    }
}

続いて、EmployeeServiceというクラスを作り、ビジネスロジックをまとめます。


@Service
public class EmployeeService {

    private final EmployeeDao employeeDao;

    public EmployeeService(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }

    public boolean register(String name, String email) {
        return employeeDao.insert(name, email) > 0;
    }
}

最後に、@Controllerでは以下のように呼び出します。


@Controller
public class EmployeeController {

    private final EmployeeService employeeService;

    public EmployeeController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @PostMapping("/register")
    public String register(@RequestParam String name, @RequestParam String email) {
        boolean success = employeeService.register(name, email);
        return success ? "success" : "error";
    }
}

このようにDAOやServiceに分けて構成することで、機能の再利用性が高まり、開発や保守も楽になります。

今後は、バリデーションやトランザクション制御もService層に追加していくことで、より強固な設計になります。

8. 登録処理を単体テストするための考え方(簡易でOK)

8. 登録処理を単体テストするための考え方(簡易でOK)
8. 登録処理を単体テストするための考え方(簡易でOK)

INSERT文によるデータベース登録が正しく動作するかどうかは、単体テストで検証することが重要です。

特に、ビジネスロジックをServiceクラスに分けている場合は、Service単位でのJUnitテストが有効です。

ここでは、EmployeeServiceをテスト対象とした簡易な単体テストの例を紹介します。


@SpringBootTest
public class EmployeeServiceTest {

    @Autowired
    private EmployeeService employeeService;

    @Test
    public void testRegister() {
        String name = "テスト太郎";
        String email = "test@example.com";
        boolean result = employeeService.register(name, email);
        Assertions.assertTrue(result);
    }
}

このテストでは、registerメソッドにサンプルデータを渡し、登録に成功したかどうかをassertTrueで確認しています。

本番用のデータベースを直接使うのではなく、テスト用のH2などのインメモリデータベースを使うと、データ破損のリスクも減り、実行も高速になります。

また、DAOをMockにしてテストする方法もありますが、まずは実データでの動作確認が取れると安心です。

このように、Spring JDBCを使ったデータベース登録処理は、しっかりと単体テストを組み合わせることで品質の高いアプリケーションに近づけることができます。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
Java のメソッドとは?基本の書き方を学ぼう
Javaの多次元配列(2次元配列)とは?初心者向けにわかりやすく解説
Javaの配列をコピーする「Arrays.copyOf()」の基本を初心者向けに解説
Javaの配列をソートする「Arrays.sort()」の使い方を初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
Java のファイル構成を理解しよう(.javaと.class)|初心者向けにわかりやすく解説
No.2
Java&Spring記事人気No2
Spring Bootで学ぶ!セッションの有効期限(タイムアウト)設定の基礎
No.3
Java&Spring記事人気No3
Spring BootでDB接続設定をする方法を完全ガイド!初心者でもわかるapplication.ymlの書き方
No.4
Java&Spring記事人気No4
コントローラー・サービス・リポジトリの役割と配置場所をわかりやすく解説!初心者向けSpringアーキテクチャ入門