IT初学者部

プログラミングに関することを中心に、備忘録として残していきます。

Spring bootプロジェクトでDBからレコードを取り出す。(java側の処理作成 -後編-)

はじめに

前回の記事では、gradleの設定までを行うところまでを記事にしました。

今回は、gradleの設定に少し修正を加え、DBの接続先を設定し、Java側の設定を行い取り出すところまでを行います。

javaのバージョン設定を変更

現在のbuild.gradleです。

plugins {
    id 'org.springframework.boot' version '2.6.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'ex.output'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    runtimeOnly 'org.postgresql:postgresql'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
    useJUnitPlatform()
}

違うのはここです。

sourceCompatibility = '15'

これは、javaのビルドバージョンを指定している箇所になります。

前回の記事作成時はJavaのバージョンは11を指定したのですが、今回は15を設定します。 理由としては、java11にはなく、15にはある機能を使いたいからです。機能については後ほど説明します。

build.gradleの設定が完了したら、次はapplication.propertiesの設定をしましょう。

接続先データベースの設定

src/main/resourcesの中に、application.propertiesファイルが有るはずです。そこに、以下の記載をしましょう。

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/(データベース名)
spring.datasource.username=(ユーザ名)
spring.datasource.password=(パスワード)

括弧内にはそれぞれ各自で用意したものを入力してください。前回の記事そのままの場合は、(データベース名)に「contents_app_db」を、ユーザ名、パスワードはそれぞれ自分の設定したものを入力してください。

これが終わったら、一度Springbootアプリケーションとして起動してみましょう。エラーが出なければ設定自体は完了です。

処理を作成する

まず、ディレクトリ設定をちょっと変更します。

src/main/java/ex/output/contentsapp内に、controllerフォルダとserviceフォルダを作成します。

次に、controllerフォルダ、serviceフォルダそれぞれにTestフォルダを作成します。

controller/test内に、TestControllerファイルと、dtoフォルダを作ります。dtoフォルダ内にTestDtoファイルを作成します。

service/test内にはTestServiceファイルを作成します。

簡単に説明すると、Controllerは指示を受け取り、それをServiceに送る役割のものくらいに思っておけば良いです。 Serviceクラスは指示に基づいてどんなことを行うのか、それが書いてある所です。 DTOはData Transfer Objectの略で、データを送信する際などに使うクラスのことです。

ここでやっている処理は、Controllerで受け取った指示に基づいてServiceで処理を行い、出力したデータをDTOを使って表示するという内容です。そんな感じで大丈夫です。

まずはControllerです。

package ex.output.contentsapp.controller.test;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import ex.output.contentsapp.controller.test.dto.TestDto;
import ex.output.contentsapp.service.test.TestService;

@RestController
public class TestController {

    @Autowired
    private TestService testSv;

    @RequestMapping("/")
    public List<TestDto> init() {
        return testSv.initTest();
    }
}

@Autowiredを使うことで、Serviceクラスの処理を利用できるようになります。Springbootで利用できる記載の方法になりますが、通常であればクラスを宣言して利用できるようにするのをこれを入れるだけで呼び出して使えるようになる、みたいに思っておけばいいです。

Autowired (Spring Framework 5.3.17 API) - Javadoc

次に、DTOクラスです。

package ex.output.contentsapp.controller.test.dto;

import lombok.Data;

@Data
public class TestDto {

    public int id;

    public String name;

    public int deleteFlg;
}

@Dataを使うことで、@Getter @Setter等を一々書いていたものを書かなくて良くなります。lombokを依存関係に入れたことで利用可能になったやつですね。

https://projectlombok.org/features/Data

最後に、Serviceクラスです。

package ex.output.contentsapp.service.test;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;

import ex.output.contentsapp.controller.test.dto.TestDto;

@Service
public class TestService {

    @Autowired
    private NamedParameterJdbcTemplate jdbc;

    public List<TestDto> initTest() {
        String searchSql = sql;

        RowMapper<TestDto> rowMapper = new BeanPropertyRowMapper<TestDto>(TestDto.class);

        return jdbc.query(searchSql, rowMapper);
    }

    private static final String sql = """
        SELECT
            id
            , name
            , delete_flg
        FROM
            mst_test;
    """;
}

NamedParameterJdbcTemplateとは、JdbcTemplate(データベース接続のときに使うやつ)の強化版くらいに思っておけば良いです。

NamedParameterJdbcTemplate (Spring Framework 5.3.17 API) - Javadoc

…というのは流石に雑すぎるので、一応解説を。

JdbcTemplateでデータベースへの処理を行う際に、?を使って検索処理等を作成しているのですが、このNamedParameter~は名前の通り、名前付きのパラメーター(:id や :nameなど)というような形で記述して処理を行うことが出来ます。

そもそもJDBCではなくJPAを使って呼び出す処理など、いろいろな方法があるのですが、個人的な開発をする際に私は基本的にはこれを使っているのでこの方法で記載します。

RowMapperとは、jdbcTemplateで使用されるもので、データを取り出してきた際のマッピングを行うことが出来ます。

RowMapper (Spring Framework 5.3.17 API) - Javadoc

BeanPropertyRowMapperとは、rowMapperで行うマッピング処理を、取得列の名称とプロパティの名前が合致すればそのまま出力してくれるやつです。(この列にはこのプロパティのもの!みたいな指定をする必要がない)

BeanPropertyRowMapper (Spring Framework 5.3.17 API) - Javadoc

いずれにしても、記述を減らすために利用されているものです。こんな感じで作成していきます。

最後に、SQLの内容になります。 なんの変哲もないSQLですが、Java15を指定してビルドすることで、先程記載していたある機能、テキストブロックを利用することが出来ています。

これは何かというと、旧来のJavaの場合、複数行の文字列入力は自動で改行され、ソースが汚くなってしまうことが多かったと思いますが、Java15を指定することと、Eclipse側の設定を少し変更することでこのような複数行の文字列でも自動改行による改行コードの表示などがされることなくソースに文字列を記載できます。

この辺の話については後日別の記事などで比較しながら作成します。

起動して確認する

Springbootアプリケーションとして実行し、http://localhost:8080/にアクセスします。

f:id:hirm159:20220322204912p:plain

こんな感じでデータベースのテーブルから取得した結果を表示できていれば、成功です。

application.propertiesをgitignoreに指定し、githubにプッシュして終了です。と言いたいところだったのですが、少し躓いてしまった為、propertiesファイルをyamlに変換し、gitignoreに*.ymlを追加後に改めてプッシュし、終了です。

この辺についても、また後日別の記事で解説します。

終わりに

一応分割したんですが、それでも記事が長くなってしまいました。もう2つに分けても良かったかなとは思います。

補足的に2点ほど(テキストブロックの話と、gitignoreの挙動に関する話)については記事を作成してまた解説してみます。