【Angular v19 + SpringBoot 08】データベース接続

【スキル】エンジニア
たけ坊
たけ坊

バックエンドの花形、DB接続に入るよ!

これをやってみたかった!

前提

これまでの流れはこちら!

参考

今回の内容は以下のサイトを参考にしています。先に読んでみてね!

Spring JDBCでDB接続 - Qiita
今回はSpringJDBCを使ってDBを操作します。環境クライアント側OS: macOS Big Sur バージョン11.1STS: Spring Tool Suite 4 Version:…

設定

Spring BootにMySQLの存在を知らせます。

pain-log-management/
└── management/
    └── src/
        └── main/
            └── resources/
                └── application.properties
spring.application.name=management
spring.datasource.url=jdbc:mysql://db:3306/mydatabase
spring.datasource.username=tkbo
spring.datasource.password=mypassword
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

いままでの流れをすべて行ってきた人は設定していると思いますが、pom.xmlに、

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>

を加えてます。これで基本設定完了です!

実装

作成するspring bootのプロジェクト構成は以下の通りです。

pain-log-management/
└── src/main/java/com/painlog/management/
   ├── controller/
   │   └── PatientController.java
   ├── domain/
   ├── model/
   │   ├── InsertPatient.java
   │   └── Patient.java
   ├── repository/
   │   ├── jdbc/
   │   │   └── PatientDaoJdbc.java
   │   └── PatientDao.java
   └── service/
       └── PatientService.java

モデル作成

Patient.java

package com.painlog.management.domein.model;

import java.time.LocalDate;
import lombok.Data;

@Data
public class Patient {
    private int id;
    private LocalDate date;
    private String name;
    private String movement;
    private int vas;
    private String memo;
}

InsertPatient.java

package com.painlog.management.domein.model;

import java.time.LocalDate;
import lombok.Data;

@Data
public class InsertPatient {
    private LocalDate date;
    private String name;
    private String movement;
    private int vas;
    private String memo;
}

リポジトリ作成

インターフェース作成

PatientDaoJdbc.java

package com.painlog.management.domein.repository;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.painlog.management.domein.model.InsertPatient;
import com.painlog.management.domein.model.Patient;

public interface PatientDao {
    // Insert a single record into the Patient table.
    public int insertOne(InsertPatient patient) throws DataAccessException;
    // Search for the specified name, movement into the Patient table.
    public List<Patient> search(String name, String movement) throws DataAccessException;
    // Select all records into the Patient table.
    public List<Patient> select() throws DataAccessException;
    // Upload a single recoed into the Patient table.
    public int updateOne(Patient patient) throws DataAccessException;
    // Delete a single record into the Patient table.
    public int deleteOne(int id) throws DataAccessException;

}

実装クラス作成

PatientDaoJbdcImpl.java

package com.painlog.management.domein.repository.jdbc;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.painlog.management.domein.model.InsertPatient;
import com.painlog.management.domein.model.Patient;
import com.painlog.management.domein.repository.PatientDao;

@Repository("PatientDaoJdbc")
public class PatientDaoJdbc implements PatientDao {

    @Autowired
    JdbcTemplate jdbc;

    // Insert a single record into the Patient table.
    @Override
    public int insertOne(InsertPatient patient) throws DataAccessException {
        int rowNumber = jdbc.update(
            "INSERT INTO mydatabase.patients(date" + "name," + " movement," + " vas," + "memo)"
                        + " VALUES(?, ?, ?, ?, ?)",
            patient.getDate(), patient.getName(), patient.getMovement(), patient.getVas(), patient.getMemo());
        return rowNumber;
    }

    // Search for the specified name, movement into the Patient table.
    @Override
    public List<Patient> search(String name, String movement) throws DataAccessException {
        String sql = "SELECT * FROM mydatabase.patients WHERE name LIKE ? AND movement LIKE ?";
        Object[] params = {"%" + name + "%", "%" + movement + "%"};

        List<Patient> patients = jdbc.query(sql, params, (rs, rowNum) -> {
            Patient patient = new Patient();
            patient.setId(rs.getInt("id"));
            Date sqlDate = rs.getDate("date");
            patient.setDate(sqlDate.toLocalDate());
            patient.setName(rs.getString("name"));
            patient.setMovement(rs.getString("movement"));
            patient.setVas(rs.getInt("vas"));  
            patient.setMemo(rs.getString("memo"));

            return patient;
        });

        return patients;
    }


    // Select all records into the Patient table.
    @Override
    public List<Patient> select() throws DataAccessException {
        List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM mydatabase.patients");
        List<Patient> patientList = new ArrayList<>();
        for (Map<String, Object> map : getList) {
            Patient patient = new Patient();
            patient.setId((Integer) map.get("id"));
            Date sqlDate = (Date) map.get("date");
            patient.setDate(sqlDate.toLocalDate()); 
            patient.setName((String) map.get("name"));
            patient.setMovement((String) map.get("movement"));
            patient.setVas((Integer) map.get("vas"));
            patient.setMemo((String) map.get("memo"));
            patientList.add(patient);
        }
        return patientList;
    }

    // Upload a single recoed into the Patient table.
    @Override
    public int updateOne(Patient patient) throws DataAccessException {
        int rowNumber = jdbc.update(
            "Update mydatabase.patients" + " SET" + " date = ?," + " name = ?," + " movement = ?," + " vas = ?," + " memo = ?",
            patient.getDate(), patient.getName(), patient.getMovement(), patient.getVas(), patient.getMemo());
        return  rowNumber;
    }
    
    // Delete a single record into the Patient table.
    @Override
    public int deleteOne(int id) throws DataAccessException {
        int rowNumber = jdbc.update(
            "DELETE FROM mydatabase.patients WHERE id = ?", id);
        return rowNumber;
    }
}

サービス作成

PatientService.java

package com.painlog.management.domein.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.painlog.management.domein.model.InsertPatient;
import com.painlog.management.domein.model.Patient;
import com.painlog.management.domein.repository.PatientDao;

@Transactional
@Service
public class PatientSearvice {
    @Autowired
    @Qualifier("PatientDaoJdbc")
    PatientDao dao;

    // Method for adding one item.
    public boolean insert(InsertPatient patient) {
        int rowNumber = dao.insertOne(patient);
        boolean result = false;
        if (rowNumber > 0) {
            result = true;
        }
        return result;
    }

    // Method for retrieving all records.
    public List<Patient> select() {
        return dao.select();
    }

    // Method for retrieving multiple records.
    public List<Patient> search(String name, String movement) {
        return dao.search(name, movement);
    }

    // Method for updating one item.
    public boolean update(Patient patient) {
        int rowNumber = dao.updateOne(patient);
        boolean result = false;
        if (rowNumber > 0) {
            result = true;
        }
        return result;
    }

    // Method for daleting one item.
    public boolean delete(int id) {
        int rowNumber = dao.deleteOne(id);
        boolean result = false;
        if (rowNumber > 0) {
            result = true;
        }
        return result;
    }
}

コントローラ作成

PatientController.java

package com.painlog.management.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.painlog.management.domein.model.InsertPatient;
import com.painlog.management.domein.model.Patient;
import com.painlog.management.domein.service.PatientSearvice;

@RestController
@CrossOrigin(origins = "http://localhost:4200")
public class PatientController {
    
    @Autowired
    PatientSearvice patientSearvice;

    @PostMapping("/insert")
    public String insert(@RequestBody InsertPatient patient) {
        String result = "";
        if (patientSearvice.insert(patient))
            result = "一件追加しました!";
        else
            result = "追加失敗しました!";
        return result;
    }

    @GetMapping("/select")
    public List<Patient> select() {
        return patientSearvice.select();
    }

    @GetMapping("/search")
    public List<Patient> search(String name, String movement) {
        return patientSearvice.search(name, movement);
    }

    @PostMapping("/update")
    public String update(@RequestBody Patient patient) {
        String result = "";
        if (patientSearvice.update(patient))
            result = "一件更新しました!";
        else
            result = "更新失敗しました!";
        return result;
    }

    @PostMapping("/delete")
    public String delete(@RequestBody int id) {
        String result = "";
        if (patientSearvice.delete(id))
            result = "一件削除しました!";
        else
            result = "削除失敗しました!";
        return result;
    }

}

これで実装完了です!

実行

実行するときは、devcontainer上ではなく、WSL上で行ったほうがうまくいきます…。

WSLでpain-log-management/.devgonteiner下まで移動し、

docker-compose up -d

でDockerを立ち上げ、

docker-compose exec management /bin/bash

でバックエンドのコマンドを開き、pom.xmlがあるmanagement下まで移動します。

cd ./management/management

それからサーバーを起動します。

mvn spring-boot:run

この状態でリモートWSLの別のコマンドから

curl http://localhost:8081/select

を実行すると、MySQLの値が返ってきます!

次のステップ

Angularで機能を追加していきます!

【Angular v19 + SpringBoot 09】検索機能の追加
たけ坊ここからは機能追加を行っていくよ!バージョンアップしてくんですね!前提これまでの流れはこちらから!実装検索機能を追加するために、searchコンポーネントを以下のディレクトリに追加します。ng-pain-log/└── pain-lo...
タイトルとURLをコピーしました