Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

SpringBoot JDBCを使う方法(JdbcTemplateの使用方法)

Spring Boot の Webアプリで、JdbcTemplate を使ってデータにアクセスする方法を書いていきます。

バージョン

使用した製品のバージョンは以下の通りです。

1. ビルドファイルの作成

プロジェクトのフォルダ spring-jdbc を作成して、その下に Maven のビルドファイルを作成します。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.1</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>org.example</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>1.0.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>17</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

依存性に spring-boot-starter-jdbc を追加すると、JdbcTemplate が使えるようになります。

2. モデルの作成

データを保持するクラスを作成します。

src/main/java/org/example/model/Teacher.java

package org.example.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.sql.Timestamp;

@NoArgsConstructor
@AllArgsConstructor
@Getter @Setter
public class Teacher {
  private Long id;
  private String name;
  private Timestamp updateTime;
  private Timestamp createTime;
}

3. リポジトリの作成

JdbcTemplate を使って、データを操作するクラスを作成します。

src/main/java/org/example/repository/TeacherRepository.java

package org.example.repository;

import org.example.model.Teacher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.sql.Types;

@Repository
public class TeacherRepository {
  @Autowired
  JdbcTemplate jdbc;

  private static final String INSERT =
    "INSERT INTO teacher (name) values (?) RETURNING id";

  public Teacher create(Teacher teacher) {
    Object[] params = new Object[] {teacher.getName()};
    int[] paramTypes = new int[] {Types.VARCHAR};
    Long id = jdbc.queryForObject(
      INSERT, params, paramTypes, (rs, rowNum) -> {
        return rs.getLong("id");
    });
    return select(id);
  }

  private static final String SELECT =
    "SELECT id, name, update_time, create_time" +
      " FROM teacher WHERE id = ?";

  public Teacher select(Long id) {
    Object[] params = new Object[] {id};
    int[] paramTypes = new int[] {Types.BIGINT};
    return jdbc.queryForObject(
      SELECT, params, paramTypes, (rs, rowNum) -> {
        return new Teacher(
          rs.getLong("id"), rs.getString("name"),
          rs.getTimestamp("update_time"),
          rs.getTimestamp("create_time")
        );
      }
    );
  }
}

4. コントローラーの作成

リクエストを受け付けて、リポジトリに処理を委譲するクラスを作成します。

src/main/java/org/example/controller/TeacherController.java

package org.example.controller;

import org.example.model.Teacher;
import org.example.repository.TeacherRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/teachers")
public class TeacherController {
  @Autowired
  TeacherRepository repository;

  @PostMapping
  public Teacher create(@RequestBody Teacher teacher) {
    return repository.create(teacher);
  }

  @GetMapping("/{id}")
  public Teacher read(@PathVariable Long id) {
    return repository.select(id);
  }
}

※ サービスクラスは省略しています。

5. 起動クラスの作成

アプリを起動するクラスを作成します。

src/main/java/org/example/SpringApp.java

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringApp {
  public static void main(String[] args) {
    SpringApplication.run(SpringApp.class, args);
  }
}

6. 設定ファイルの作成

PostgreSQL に接続するための設定ファイルを作成します。

src/main/resources/application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=usr
spring.datasource.password=pass

spring.jackson.date-format=yyyy/MM/dd HH:mm:ss
spring.jackson.time-zone=Asia/Tokyo

JSON の日時のフォーマットとタイムゾーン(日本時間)も設定しています。

7. テーブルの作成

以下の SQL でテーブルを作成します。

CREATE TABLE teacher (
  id bigserial PRIMARY KEY,
  name varchar(60) NOT NULL,
  update_time timestamp NOT NULL DEFAULT current_timestamp,
  create_time timestamp NOT NULL DEFAULT current_timestamp
);

8. アプリの起動

起動クラスを実行するか、以下のコマンドでアプリを起動します。

mvn spring-boot:run

9. 動作確認

確認コマンドの JSONエスケープ「\」は、Windows で必要になります。

9.1. データの作成

以下のコマンドで、データを一つ作成します。

curl -H "Content-Type: application/json" -d "{\"name\":\"Jhon Doe\"}" -X POST http://localhost:8080/teachers

実行すると JSON が返ってきます。

{"id":1,"name":"Jhon Doe","updateTime":"2022/12/24 00:06:21","createTime":"2022/12/24 00:06:21"}

9.2. データの参照

以下のコマンドで、作成したデータを参照することができます。

curl http://localhost:8080/teachers/1